我有一个表“@ table1”,我想通过RowID递归更新从BOTTOM到TOP排序的“Amount”列。如果最终结果仍为负值,则将负值减去上面行的值,将该值减去下一行,将前一个值替换为0.
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,10),
(3,-10),
(4,10),
(5,-5),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 10
3 -10
4 10
5 -5
6 30
结果表
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,0),
(3,0),
(4,5),
(5,0),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 0
3 0
4 5
5 0
6 30
答案 0 :(得分:1)
我能想到实现这个(作为单个查询)的唯一方法是使用running total 之类的东西。这有效地最终加入了Product表格,使得对于“left”表中的每一行,“right”表包含“在它之前”的所有记录。这样,您可以保持更新字段的运行总计。不幸的是,编写和执行非常混乱。
根据您的预期使用场景,这可能是游标更好的替代方案之一。使用游标和表变量编写一个应该是相对微不足道的。