Untitled

 avatar
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