Untitled
unknown
plain_text
a year ago
1.9 kB
8
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 FIFOEditor is loading...
Leave a Comment