2014-09-02 1 views
-1

두 개의 쿼리가 있습니다. 첫 번째의 결과는 창고 부분의 - 남은 수량 :값이 0에 도달 할 때까지 누적하십시오.

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 
은 이 제로, 예를 돌 때까지 TranQty-

은 지금은 OnHandQy을 계산해야 나는 다음과 같은 표를받을 필요 결과

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 

모든 아이디어를 어떻게이 결과를 얻는 방법?

+0

최종 출력을 나타내는 임시 테이블을 만들고 WHILE 루프 중에 채 웁니다. –

+0

호기심에서 벗어나 OnHandQty 정밀도는 소수점 100 자리까지되는 이유는 무엇입니까? – nshah

+0

OnHandQty의 정밀도는 측정 단위가 KG (항상 PCS는 아님)이기 때문에입니다. – user3249274

답변

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 
0

OnHandQty를 선언하고 while 루프에서 커서를 사용하면 이것을 정렬하는 데 도움이됩니다.

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 
관련 문제