Untitled
unknown
plain_text
6 months ago
1.9 kB
5
Indexable
DECLARE @Income AS TABLE( ID INT, Qty INT ) DECLARE @SALES AS TABLE( ID INT, Qty INT ) insert into @Income (ID,QTY) values (1,20),(2,13),(3,15) insert into @SALES (ID,QTY) values (1,10),(2,15),(3,7),(4,14) ;WITH SALES AS ( SELECT * ,ISNULL(LAG(RunningSales) OVER ( ORDER BY ID ASC ), 0) AS prevSales FROM ( SELECT * ,SUM(qty) OVER ( ORDER BY ID ) AS RunningSales FROM @SALES ) s ) ,INC AS ( SELECT * ,ISNULL(LAG(RunningInc) OVER ( ORDER BY ID ASC ), 0) AS prevInc FROM ( SELECT * ,SUM(qty) OVER ( ORDER BY ID ASC ) AS RunningInc FROM @Income ) inc ) ,BUYS AS ( SELECT S.id AS SellID ,s.qty AS SellQty ,i.QTY AS BuyQty ,i.id AS BuyID ,s.RunningSales ,i.RunningInc ,ROW_NUMBER() OVER ( ORDER BY S.id ) AS rn ,ROW_NUMBER() OVER ( ORDER BY S.id ) - 1 AS parentID FROM SALES s LEFT JOIN INC i ON s.RunningSales > i.prevInc AND s.prevSales < i.RunningInc ) ,FIFO AS ( SELECT b.SellID ,b.SellQty ,GREATEST(b.RunningSales - b.RunningInc, 0) AS SellRest ,LEAST(b.RunningInc, b.SellQty) AS ClosedQty ,GREATEST(b.RunningInc - b.RunningSales, 0) AS BuyRest ,b.BuyID ,b.BuyQty ,b.rn ,b.parentID ,b.RunningInc ,b.RunningSales FROM BUYS b WHERE b.rn = 1 UNION ALL SELECT b.SellID ,b.SellQty ,GREATEST(b.RunningSales - b.RunningInc, 0) AS SellRest ,CASE WHEN f.SellRest > 0 THEN LEAST(f.SellRest, b.BuyQty) ELSE b.SellQty - GREATEST(b.RunningSales - b.RunningInc, 0) END AS ClosedQty ,GREATEST(b.RunningInc - b.RunningSales, 0) AS BuyRest ,b.BuyID ,b.BuyQty ,b.rn ,b.parentID ,b.RunningInc ,b.RunningSales FROM BUYS b JOIN FIFO f ON b.parentID = f.rn ) SELECT SellID ,SellQty ,SellRest ,ClosedQty ,BuyRest ,BuyID ,BuyQty FROM FIFO
Editor is loading...
Leave a Comment