2011-09-21 36 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的東西。這有效地結束了將產品表加入其自身的方式,即對於「左」表中的每一行,「右」表包含「先於它」的所有記錄。這樣,您可以保持更新字段的運行總數。不幸的是,編寫和執行起來非常混亂。

根據您的預期使用場景,這可能是遊標是更好的替代方案的罕見情況之一。使用遊標和表變量寫一個應該是相對平凡的。