我正在编写发货交付报告,以确定发货是否在发货窗口内完成。
每个版本都有一个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发货才能被认为是准时的。Part XYZ虽然可以在9/1之后2天发货,但仍然可以被认为是按时发货,但由于9/3不在我们的发货天数内,那么9/5是它可以发货的最后一天,并且仍然可以被认为是按时发货。
我认为答案在于联接shipping days表的一个子查询,该查询为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等于发布的窗口值的日期,那么我就有了特定发货可以发货的最后一天,并且仍然被视为按时发货。
不过,我很难将所有这些都封装到最终的查询中。
这是解决问题的正确方法吗?
发布于 2011-10-28 01:08:20
也许这会让你开始:
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
https://stackoverflow.com/questions/7919422
复制相似问题