我的答案直接基于此答案的Recursive CTEs部分中的第二个查询。
当我了解您的情况时,我创建了一个库存表。我的解决方案基于InventoryDate,而不是星期几。我要提到的最后一项是您的初始库存编号来自前一周的最终库存编号。但是,这必须在某个地方定义。我将它硬编码为递归 CTE 的锚成员。您可以将其作为参数传入或使用子查询获取。
CREATE TABLE Inventory
(
InventoryDate DATE
, Produced INT
, Sold INT
);
INSERT INTO Inventory
(
InventoryDate
, Produced
, Sold
)
VALUES
('2020-07-20', 10, 8)
, ('2020-07-21', 9, 7)
, ('2020-07-22', 11, 10)
, ('2020-07-23', 10, 10)
, ('2020-07-24', 9, 8)
, ('2020-07-25', 7, 8)
, ('2020-07-27', 12, 14);
WITH y AS
(
SELECT
rn = ROW_NUMBER() OVER (ORDER BY InventoryDate)
, InventoryDate
, Produced
, Sold
FROM Inventory
)
, x AS
(
SELECT
CONVERT(BIGINT, 0) AS [rn]
, DATEADD(DAY, -1, MIN(InventoryDate)) AS [IventoryDate]
, NULL AS [Initial]
, NULL AS [Produced]
, NULL AS [Sold]
, 80 AS [Final]
FROM Inventory
UNION ALL
SELECT
y.rn
, y.InventoryDate
, x.Final AS [Initial]
, y.Produced
, y.Sold
, x.Final + y.Produced - y.Sold AS [Final]
FROM x
INNER JOIN y ON y.rn = x.rn + 1
)
SELECT
x.rn
, x.IventoryDate
, x.Initial
, x.Produced
, x.Sold
, x.Final
FROM x;
这是此代码的演示。