我有两个问题。 第一个结果是仓库中零件的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
如何获得此结果的任何想法?
答案 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