2011-09-21 48 views
-1

我有一个表“@ table1”,我想递归地更新从“底部”的“金额”列到由RowID排序的顶部。即取负的值中减去该值与行的值以上时,如果最终的结果仍是负减去与下一行该值,以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 
+1

单值110?为什么从50中减去50,忽略了0,并且12和34保持不变?负面价值观与什么有什么关系(我在这里没有看到任何负面价值)?这个问题不清楚,我想你已经遗漏了一些信息。 –

+0

@AaronBertrand - 不确定为什么有人想要这样做,但要求似乎是这样的:从最后一条记录开始,为行减去110或ProductCount,以最大者为准(即)不要变为负值。更新要减去的数字,然后重复,直到没有剩余部分要减去。 –

+0

@KipReal:问题不清楚。如果你想得到很好的答案,请添加补充信息。我没有投票。 –

回答

1

我能想到实现这个(作为单个查询)的唯一方法就是使用类似于running total的东西。这有效地结束了将产品表加入其自身的方式,即对于“左”表中的每一行,“右”表包含“先于它”的所有记录。这样,您可以保持更新字段的运行总数。不幸的是,编写和执行起来非常混乱。

根据您的预期使用场景,这可能是游标是更好的替代方案的罕见情况之一。使用游标和表变量写一个应该是相对平凡的。