总和直到值达到零

时间:2014-09-02 12:48:13

标签: sql-server-2008

我有两个问题。 第一个结果是仓库中零件的OnHand数量:

PartNum  OnHandQty  IUM
100009   19430.00   KG

第二个查询的结果是与仓库货物收据相关的交易:

TranDate     PartNum    TranQty     UM  Dayss
2014-09-01   100009     10720.000   KG  2
2014-09-01   100009     1340.000    KG  2
2014-08-11   100009     8710.000    KG  23
2014-08-11   100009     3350.000    KG  23
2014-06-30   100009     9380.000    KG  65

现在我需要计算 OnHandQy - TranQty ,直到它达到 ,例如

19430 - 10720 = 8710 --not enough 
8710 - 1340 = 7370   --not enough 
7370 - 8710 = -1340  --enough 

因此,我需要收到如下表格:

PartNum  OnHandQty  IUM  [0-10 Days]  [11-20 Days]   [over 21 Days]
100009   19430.00   KG   12060        null           8710

如何获得此结果的任何想法?

3 个答案:

答案 0 :(得分:0)

一个想法是使用以下查询。

WITH(TranDate,PartNum,TranQty,UM,Dayss) trans
AS
(
    -- Your second query
)
SELECT F.PartNum
    ,F.OnHandQty
    ,F.IUM  
    ,SUM(t0to10.TransQty) AS [0-10 Days]
    ,SUM(t11to20.TransQty) AS [11-20 Days]
    ,SUM(tover20.TransQty) AS [over 21 Days]
FROM (Your first query) AS F
    JOIN trans AS t0to10 ON F.PartNum = t0to10.PartNum 
        AND t0to10.Dayss BETWEEN 0 AND 10 
    JOIN trans AS t11to20 ON F.PartNum = t11to20.PartNum 
        AND t11to20.Dayss BETWEEN 11 AND 20
    JOIN trans AS tover20 ON F.PartNum = tover20.PartNum 
        AND tover20.Dayss >20 
GROUP BY F.PartNum,F.OnHandQty,F.IUM  

答案 1 :(得分:0)

声明OnHandQty并在while循环中使用游标将有助于对此进行排序。

答案 2 :(得分:0)

CREATE TABLE #OnHand(
    PartNum  NVARCHAR(100)
    ,OnHandQty DECIMAL
    ,IUM NVARCHAR(5)
    )

INSERT INTO #OnHand
    (PartNum, OnHandQty, IUM)
VALUES  
    ('100009', 19430.00, 'KG')


CREATE TABLE #Trans(
    TranDate DATETIME
    ,PartNum NVARCHAR(100)
    ,TranQty DECIMAL
    ,IUM NVARCHAR(5))

INSERT INTO #Trans
    (TranDate, PartNum, TranQty, IUM)
VALUES
 ('2014-09-01',   '100009',     10720.000,   'KG')
,('2014-09-01',   '100009',     1340.000,    'KG')
,('2014-08-11',   '100009',     8710.000,    'KG')
,('2014-08-11',   '100009',     3350.000,    'KG')
,('2014-06-30',   '100009',     9380.000,    'KG')

DECLARE @OnHand_Running DECIMAL
        ,@OnHandQty DECIMAL
        ,@TranQty DECIMAL
        ,@TranDate DATETIME
        ,@PartNum NVARCHAR(100)
        ,@First10Days INT = 0
        ,@Second10Days INT = 0
        ,@Third10Days INT = 0

SET @PartNum = '100009';

Set @OnHandQty = (Select OnHandQty
                    FROM #OnHand
                    WHERE PartNum = @PartNum)

Set @OnHand_Running = @OnHandQty 

DECLARE tran_cursor CURSOR
    FOR SELECT T.TranQty, T.TranDate
    FROM #Trans T
    ORDER BY T.TranDate DESC
OPEN tran_cursor

FETCH NEXT FROM tran_cursor
INTO @TranQty, @TranDate

WHILE (@@FETCH_STATUS = 0) AND (@OnHandQty > 0)
BEGIN

    IF (@OnHandQty - @TranQty) < 0
    BEGIN
        PRINT CAST(@OnHandQty AS NVARCHAR(100)) + '-' + CAST(@TranQty AS NVARCHAR(100)) + '=' + CAST(@OnHandQty - @TranQty AS NVARCHAR(100)) + '  --Enough'
    END
    ELSE
    BEGIN
        PRINT CAST(@OnHandQty AS NVARCHAR(100)) + '-' + CAST(@TranQty AS NVARCHAR(100)) + '=' + CAST(@OnHandQty - @TranQty AS NVARCHAR(100)) + '  --Not Enough'
    END

    IF (DATEDIFF(DAY, @TranDate, CURRENT_TIMESTAMP) < 10)
    SET @First10Days = @First10Days + @TranQty

    IF (DATEDIFF(DAY, @TranDate, CURRENT_TIMESTAMP) BETWEEN 10 AND 20)
        SET @Second10Days = @Second10Days + @TranQty

    IF (DATEDIFF(DAY, @TranDate, CURRENT_TIMESTAMP) > 20)
        SET @Third10Days = @Third10Days + @TranQty

    SET @OnHandQty = @OnHandQty - @TranQty  

    FETCH NEXT FROM tran_cursor
    INTO @TranQty, @TranDate
END

SELECT @PartNum, @OnHand_Running, 'KG', @First10Days '[0-10] Days', @Second10Days '[11-20] Days', @Third10Days '[over 21 days]' 
CLOSE tran_cursor;
DEALLOCATE tran_cursor;
RETURN