2011-09-23 3 views
2

SQL 문에 몇 가지 문제점이 있습니다. 다음 설정에서 각 Customer에 대해 다음 DeliveryDate을 찾아야합니다.SQL 각 고객, SQL에 대한 다음 날짜 찾기?

테이블

Customer

  • DeliveryOrderCustomer (customerId, deliveryOrderId)
  • Customer (id)
  • DeliveryOrder (id, deliveryDate)

      동일한 deliveryDate 여러 DeliveryOrders를 가질 수있다. 각 고객에 대해 하나만 가져 오는 방법을 알아낼 수 없습니다. deliveryDate 오늘 이후에 날짜는 다음 번에 DeliveryDate이어야합니다. 나는 "각각을 위해"어떤 종류의 것이 필요 하겠지만 나는 SQL에서 그것을 해결하는 방법을 모른다.

  • +0

    SQL에서 foreach 문을 사용하는 방법에 대한 좋은 예를? – limlim

    +2

    ** ** 데이터베이스 및 버전은 무엇입니까 ?? ** SQL **은 ** 많은 ** 데이터베이스 시스템에서 사용되는 언어 인 구조화 된 쿼리 언어 일뿐입니다 ** ** SQL **은 ** 데이터베이스 제품이 아닙니다 ** 이와 같은 것들은 매우 자주 ** 벤더입니다 특정 ** - 그래서 우리는 ** 당신이 사용하고있는 ** 데이터베이스 시스템 **을 정말로 알아야합니다 .... –

    답변

    1

    또 다른 간단한 버전

    select c.id, min(o.date) 
    from customer c 
        inner join deliveryordercustomer co o on co.customerId = c.id 
        inner join deliveryorder o on co.deliveryOrderId = o.id and o.date>getdate() 
    group by c.id 
    
    +0

    +1 나는 그것을 게시하려하고있었습니다. :) –

    +0

    고마워요, 이것은 정확하게 필요한 것입니다. impressivley 간단하게 ... 단순히 인상적인 hehe – limlim

    1

    이렇게하면 subselect를 사용하여 예상 한 결과를 얻을 수 있습니다. 계정에 current_date rdbms 특정 될 수 있습니다 걸릴 오라클에 대한 작동합니다.

    select c.id, o.date 
    from customer c 
        inner join deliveryordercustomer co o on co.customerId = c.id 
        inner join deliveryorder o on co.deliveryOrderId = o.id 
    where o.date = 
        (select min(o2.date) 
         from deliveryorder o2 
         where o2.id = co.deliveryOrderId and o2.date > current_date) 
    
    1

    으로 그룹을 사용해야합니다. 이 작업을 수행하는 데는 여러 가지 방법이 있습니다. 고객을 위해 같은 날에 여러 주문을 고려한 내 솔루션이 있으며, 첫 번째, 두 번째 등 다른 쿼리 슬롯을 쿼리 할 수 ​​있습니다. Sql Server 2005 이상을 가정합니다.

    ;with CustomerDeliveries as 
    (
        Select c.id, do.deliveryDate, Rank() 
           over (Partition BY c.id order by do.deliveryDate) as DeliverySlot 
        From Customer c 
         inner join DeliveryOrderCustomer doc on c.id = doc.customerId 
         inner join DeliveryOrder do on do.id = doc.deliveryOrderId 
        Where do.deliveryDate>GETDATE() 
        Group By c.id, do.deliveryDate 
    ) 
    Select id, deliveryDate 
    From CustomerDeliveries 
    Where DeliverySlot = 1