2011-10-27 119 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

太棒了。這讓我得到了我需要的地方。 –

相關問題