我正在处理货件交付报告,以确定是否在装运窗口内发货。
每个版本都有一个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 :(得分: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