2011-09-23 73 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