2009-10-02 44 views
0

我有一個臨時表,讓我們稱之爲#invoices,定義爲如何一次性更新運行平衡?

create table (id int identity(1, 1), billed money, credited money, balance money) 

我對此非常

Billed Credited 
140.00 
20.00 
      60.00 
      20.00 
     -20.00 

以下數據我想更新餘額柱與運行平衡。以便Balance列正確更新。餘額基本上是結算 - 貸記,但必須考慮上一行的帳戶。

所以在我的例子中,平衡將是這樣:

Billed Credited Balance 
140.00    140.00 
20.00    160.00 
      60.00  100.00 
      20.00  80.00 
     -20.00 -100.00 

有沒有辦法做到這一點無需經過行循環,並保持運行平衡?基本上我正在尋找以基於集合的方式更新Balance列。

回答

3

There are基於集合的方式來計算SQL Server中的運行總計,但是在當前版本的SQL Server中基於遊標的解決方案通常更快。

Adam Machanic在上面寫了一篇很棒的文章here

+0

其實我要找的解決方案是在你提供的鏈接 - 丹尼斯艾倫的第一評論。 – AngryHacker 2009-10-02 03:44:41

-1

答案是觸發器。我使用它們,並且它運作得非常漂亮。我沒有完全的設置(如果我可以說,這有些奇怪),但總的來說,這裏是正確的方法。您需要注意訂購,但除此之外,它應該沒問題。

+0

注意人們閱讀:除非有人爲此提供了一個很好的理由,否則很重要的一點是我沒有錯 - 爲此目的,觸發器比遊標要好得多,並且保持每個事務的平衡是有點奇怪的。 – 2009-10-02 04:28:21

+0

我沒有低調,但你的方法是錯誤的。請注意,表格是臨時的。當我們可以在腳本中愉快地做到這一點時,我爲什麼要用觸發器做幕後的事情。 – AngryHacker 2009-10-02 21:03:17

+0

我沒有注意到它是臨時的;你用觸發器來做,所以你總是把它更新。然後當你想要在給定的範圍內運行查詢時,你只需要這樣做(因爲你有歷史數據)。例如,你的方法很難在給定的點插入一個新行(它可能需要重新計算)。 – 2009-10-02 23:53:39