首页 > 解决方案 > 根据前一行值更新 Closing_Balance

问题描述

我有一个包含 ID、Opening_Balance 和 Closing Balance 列的表,如下所示。这是我们的客户维护的现有表,OB 引用了需要添加/减去前一行 cb 的金额。例如,如果我从供应商那里收到 100 rs,那么我需要添加 100 作为 ob 和 600 作为 cb。

   ID   OB    CB
   ===============
    1   100   100
    2   100   200
    3   100   300
    4   100   400
    5   -100  300
    6   100   400
    7   100   500
    8   -100  400

如果我更新/删除中间的某些行,则期末余额应根据前一行值进行更新。

例如,我要为 ID = 4 更新 OB = 200,所以输出应该如下:

   ID   OB    CB
   ===============
    1   100   100
    2   100   200
    3   100   300
    4   200   500
    5   -100  400
    6   100   500
    7   100   600
    8   -100  500

我尝试了以下 sql 尝试,但它不能单次运行

UPDATE A 
SET OB = 200, CB = OB + PrevCB
FROM A JOIN (SELECT LAG(CB) OVER (ORDER BY ID)PrevCB, ID FROM A) X ON A.ID = X.ID 
WHERE A.ID = 4;

UPDATE A
SET CB = OB + PrevCB
FROM A JOIN (SELECT LAG(CB) OVER (ORDER BY ID)PrevCB, ID FROM A) X ON A.ID = X.ID 
WHERE A.ID > 4;

标签: sqlsql-serverlag

解决方案


您可以尝试使用SUM窗口功能。

UPDATE T 
SET OB = 200
FROM T 
WHERE ID = 4;

UPDATE T
SET CB = val + (SELECT CB FROM T WHERE ID = 3)
FROM T JOIN (
    SELECT SUM(OB) over(order by ID) val, ID 
    FROM T
    WHERE ID > 3
) X ON T.ID = X.ID 

sqlfiddle

结果

 ID   OB    CB
 ===============
    1   100   100
    2   100   200
    3   100   300
    4   200   500
    5   -100  400
    6   100   500
    7   100   600
    8   -100  500

推荐阅读