2011-09-23 116 views
2

我有一些SQL語句的問題。我需要在以下設置中爲每個Customer找到下一個DeliveryDateSQL爲每個客戶查找下一個日期,SQL對於每個客戶?

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

每個Customer可以在同一deliveryDate有幾個DeliveryOrders。我只是不知道如何爲每個客戶獲得一個deliveryDate。日期應該是今天之後的下一個即將到來的DeliveryDate。我覺得我需要某種「爲每個」,但我不知道如何在SQL中解決它。

+0

如何在SQL中使用的foreach任何很好的例子? – limlim

+2

**什麼**數據庫和哪個版本?? ** SQL **只是結構化查詢語言 - 許多**數據庫系統使用的語言 - ** SQL **是** NOT **數據庫產品......這類東西通常是**供應商 - 特定的** - 所以我們真的需要知道你正在使用的數據庫系統**。 –

回答

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簡單...簡直令人印象深刻的赫赫 – limlim

1

這將使用子查詢來給出預期的結果。考慮到 current_date可能是rdbms特有的,它適用於Oracle。

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

您需要使用group by。有很多方法可以做到這一點,這裏是我的解決方案,它考慮到客戶在同一天的多個訂單,並允許您查詢不同的交付插槽,第一,第二等。這假定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 
相關問題