2011-10-27 90 views
1

我正在处理货件交付报告以确定货件是否在装运窗口内进行。选择未来的日期

每个版本都有一个Ship_Date值,该值是发布版必须发布的日期。有些版本虽然具有较晚的窗口整数值,说明如果装运是在X天内完成的,那么它仍然是按时考虑的。

这是复杂的另一个表,其中包含有效月份(用于排除假期,周末等)的有效发货日。

Order_Releases_Table 
    Part_No, 
    Quantity, 
    Ship_Date, 
    Window 

Shipping_Date 
    Shipping_Day 

样本数据

Order_Releases_Table 
Part_No Quantity Ship_Date Window 
ABC  100  9/1/2011 0 
XYZ  200  9/1/2011 2 

Shipping_Date 
9/1/2011 
9/2/2011 
9/5/2011 

所以用这个数据部分ABC有出货的9/1要在时间考虑。虽然XYZ部分可以在9/1之前发货2天,但仍然可以按时发货,但由于9/3不在我们的发货日期,因此9/5是发货的最后一天,仍然可以按时发货。

我认为答案在于加入运输天表的子查询,该表查询将行号分配给shipping_day字段。

SELECT 
    Row_Number() OVER(ORDER BY Shipping_Date) AS Day_No, 
    Shipping_day 
FROM Shipping_Date 
WHERE Shipping_Day > Ship_Date 

RETURNS 
Day_No Shipping_Day 
1  9/2/2011 
2  9/5/2011 

然后,如果我只是拿起本子查询Day_No等于从释放窗口值的日期,然后我有最后一天特定的货物可以出货,但仍然可以在时间考虑。

虽然我很难将它全部包装到最终查询中。

这是解决问题的正确方法吗?

+0

你想要什么最终报告的样子? – JNK

+0

使用发布表ABC,100,9/1/2011和XYZ,200,9/5/2011中的2个示例条目。基本上它需要动态地重新调整每个版本,因为每个版本都可以有一个独立的窗口。我将用这个日期来反驳我的托运人表,以确定托运人是否实际上按时发货。 –

+0

这是否会在SQL中有点棘手。像这样的东西我可能会喜欢在代码中做,因为基于集合的逻辑(即SQL)看起来不太合适。 –

回答

3

也许这将让你开始:

DECLARE @t TABLE (Part CHAR(3), ShipDate DATETIME, Window INT) 
DECLARE @ship TABLE (ShipDate DATETIME) 

INSERT INTO @t 
     (Part, ShipDate, Window) 
SELECT 'abc', '20110901', 0 
UNION 
SELECT 'xyz', '20110901', 2 


INSERT INTO @ship 
     (ShipDate) 
SELECT '20110901' 
UNION 
SELECT '20110905' 
UNION 
SELECT '20110910' 


SELECT Part, ShipDate, Window, 
    (SELECT MIN(ShipDate) AS NextShip 
     FROM @ship S 
     WHERE s.shipDate >= DATEADD(day, t.Window, t.shipDate)) 
FROM @t t 
+0

太棒了。这让我得到了我需要的地方。 –

相关问题