2014-03-07 57 views
0

我有一個表列出了我的清單中的項目,total quantity on hand,ordered qtyship date我的SQL查詢似乎處於循環狀態

 

    +-------+-----------+------------+----------+ 
    | Item | QtyOnHand | QtyOrdered | ShipDate | 
    +-------+-----------+------------+----------+ 
    | Itema | 100  | 80   | 3/4/14 | 
    | Itemb | 80  | 220  | 3/8/14 | 
    | Itema | 100  | 80   | 3/10/14 | 
    | Itemb | 80  | 100  | 3/12/14 | 
    +-------+-----------+------------+----------+ 

我試圖創建一個查詢,將通過銷售訂單逐項日期(PromiseDate)順序滾動。使用已知的庫存金額(QtyOnHand)減去每個訂單的QtyOrdered金額,並在扣除QtyOrdered後保留QtyOnHand的運行總額,並且只在QtyOnHand爲<時寫入我的表格1這樣我就知道具體項目的日期沒有庫存。

在處理完後面的數據之後,我的新表格應該包含兩條記錄,每條記錄代表項目將耗盡庫存的日期。

請幫忙。 謝謝

CREATE TABLE #OverInv (Item VARCHAR(15), PromiseDate DATETIME, QtyOnHand INT, QtyOrdered INT, TotalOver INT) 
DECLARE @Item VARCHAR(15), 
@PromiseDate DATETIME, 
@QtyOrdered INT, 
@QtyOnHand INT, 
@CurrentItem VARCHAR(15), 
@TotalOver INT 

SET @TotalOver = 0 
SET @CurrentItem = 0 

DECLARE rt_cursor CURSOR 
FOR 
SELECT Item, PromiseDate, QtyOrdered, QtyOnHand 
FROM Inventory 

OPEN rt_cursor 

FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
WHILE @@FETCH_STATUS = 0 

IF @CurrentItem = 0 
    BEGIN 
    SET @CurrentItem = @Item 
    SET @TotalOver = (@QtyOnHand - @QtyOrdered) 

    IF @TotalOver < 1 
     BEGIN 
      INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
      FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
      SET @TotalOver = 0 
     END 
    ELSE 
     BEGIN 
      FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
     END 
    END 

IF @CurrentItem = @Item 
    SET @TotalOver = (@TotalOver - @QtyOrdered) 
    BEGIN 
    IF @TotalOver < 1 
     BEGIN 
     INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
     FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
     SET @TotalOver = 0 
     END 
    ELSE 
     BEGIN 
     FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
     END 
    END 

IF @CurrentItem <> @Item 
    SET @CurrentItem = @Item 
    SET @TotalOver = (@QtyOnHand - @QtyOrdered) 
    BEGIN 
    IF @TotalOver < 1 
     BEGIN 
      INSERT #OverInv VALUES (@Item,@PromiseDate,@QtyOnHand,@QtyOrdered,@TotalOver) 
      FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
      SET @TotalOver = 0 
     END 
    ELSE 
     BEGIN 
     FETCH NEXT FROM rt_cursor INTO @Item,@PromiseDate,@QtyOrdered,@QtyOnHand 
     END 
    END 


CLOSE rt_cursor 
DEALLOCATE rt_cursor 

SELECT * FROM #OverInv ORDER BY Item 

DROP TABLE #OverInv 

回答

0

你可以做,沒有遊標。首先,您需要將數據輸入以下格式:

Item | QtyOnHand | Initial date 
Item | -QtyOrdered | ShipDate 

然後,您需要按項目和日期對其進行總結。接下來計算數量的運行總和。最後選擇數量爲負數的最短日期。這裏是完整的查詢:

with cte1 as 
(
    -- assuming QtyOnHand is the same in all Inventory rows 
    select Item, min(QtyOnHand) as QtyOnHand, min(ShipDate) as ShipDate 
    from Inventory 
    group by Item 

    union all 

    select Item, -QtyOrdered as QtyOnHand, ShipDate 
    from Inventory 
) 
, cte2 as 
(
    -- only one row per item and date 
    select Item, SUM(QtyOnHand) as QtyOnHand, ShipDate 
    from cte1 
    group by Item, ShipDate 
) 
, cte3 as 
(
    select 
    Item, 
    SUM(QtyOnHand) OVER(partition by item order by ShipDate) as QtyOnHand, 
    ShipDate 
    from 
    cte2 
) 
select Item, min(ShipDate) as ShipDate 
from cte3 
where QtyOnHand < 0 
group by Item 

SUM()OVER()需要SQL Server 2012,但還有其他方式如何計算當然運行總和。檢查fiddle