sql server update一个语句中的Balance字段

时间:2017-04-19 14:29:14

标签: sql-server cursor common-table-expression

在Sql Server中,我有一个简单的表来存储金额和余额,如下所示:

ID  | Date      | Amount    | Balance
-------------------------------------
101 | 1/15/2017 | 3.00      | 67.50
102 | 1/16/2017 | 5.00      | 72.50
103 | 1/19/2017 | 9.00      | 81.50
104 | 1/20/2017 | -2.00     | 79.50

如果我更改了记录的数量,我需要更新该记录后的所有余额。

ID  | Date      | Amount    | Balance
-------------------------------------
101 | 1/15/2017 | 3.00      | 67.50
102 | 1/16/2017 | *5.02*    | *72.52*
103 | 1/19/2017 | 9.00      | *81.52*
104 | 1/20/2017 | -2.00     | *79.52*

到目前为止,我在此表中拥有超过1亿条记录。要做这项工作,我不想使用sql游标或客户端程序,它会提交大量的Update语句并需要几个小时才能完成。 是否可以在一个sql语句中重新计算整个表的余额?

1 个答案:

答案 0 :(得分:0)

您可以使用SUM()OVER。

在单个SQL语句中轻松完成

例如

WITH tot as (select ID, SUM(Amount) as balance OVER (order by ID)
UPDATE Tab
SET Balance = t.Balance
FROM YOURTABLE tab
JOIN Tot
ON tot.id = tab.id

如果余额被任何其他列重置,则将其用作分区依据,并包含在连接中。 现在,如果要插入新行,只需使用where子句运行此更新查询。