小编典典

SQL Update表的累积值

sql

我有这张桌子:

Date  |StockCode|DaysMovement|OnHand
29-Jul|SC123    |30          |500
28-Jul|SC123    |15          |NULL
27-Jul|SC123    |0           |NULL
26-Jul|SC123    |4           |NULL
25-Jul|SC123    |-2          |NULL
24-Jul|SC123    |0           |NULL

仅第一行具有OnHand值的原因是因为我可以从另一个存储任何股票代码的当前数量的表中获得该值。

该表中的其他记录取自另一个表,该表记录了给定日期的所有移动。

我想更新上表,以便OnHand列基于上一条记录的存量和移动显示该行日期的QtyOnHand,这样在更新结束时看起来像这样:

Date  |StockCode|DaysMovement|OnHand
29-Jul|SC123    |30          |500
28-Jul|SC123    |15          |470
27-Jul|SC123    |0           |455
26-Jul|SC123    |4           |455
25-Jul|SC123    |-2          |451
24-Jul|SC123    |0           |453

我目前正在使用CURSOR实现这一目标。但是性能确实吸引了成千上万的记录。

我可以运行一些基于SET的UPDATE语句来实现相同的结果吗?


阅读 306

收藏
2021-04-28

共1个答案

小编典典

试试这个( 小提琴演示

DECLARE @Movement INT , @OnHandRunning INT

;WITH CTE AS
(
    SELECT TOP 100 percent DaysMovement, OnHand 
    FROM Table1
    ORDER BY [StockCode], [Date] DESC
)
UPDATE CTE SET @OnHandRunning = OnHand = COALESCE(@OnHandRunning - @Movement, OnHand),
               @Movement = DaysMovement

更新: 对于多个StockCodes查询,您可以修改上面的查询,如下所示(
Fiddle演示2 ):

DECLARE @Movement INT , @OnHandRunning INT, @StockCode VARCHAR(10) = ''

;WITH CTE AS
(
    SELECT TOP 100 percent DaysMovement, OnHand, StockCode  
    FROM Table1
    ORDER BY [StockCode],[Date] DESC
)
UPDATE CTE SET @OnHandRunning = OnHand = 
       CASE WHEN @StockCode<> StockCode THEN OnHand ELSE @OnHandRunning - @Movement END,
       @Movement = DaysMovement,
       @StockCode = StockCode
2021-04-28