【问题标题】:How to update running balance in one shot?如何一键更新跑步平衡?
【发布时间】:2009-10-02 03:01:31
【问题描述】:

我有一个临时表,我们称之为#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 列。以便正确更新 Balance 列。余额基本上是 Billed - Credited,但必须考虑上一行。

所以在我的例子中,余额将是这样的:

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

有没有办法做到这一点,而无需遍历行并保持运行平衡?基本上,我希望以基于集合的方式更新 Balance 列。

【问题讨论】:

    标签: sql sql-server running-balance


    【解决方案1】:

    在 SQL Server 中种基于集合的方法来计算运行总计,但是在当前版本的 SQL Server 中,基于游标的解决方案通常更快。

    Adam Machanic 写了一篇很棒的文章 here

    【讨论】:

    • 实际上我正在寻找的解决方案在您提供的链接中 - Dennis Allen 的第一条评论。
    【解决方案2】:

    答案是触发器。我使用它们,效果很好。我没有您的确切设置(如果我可以说,这有点奇怪),但总的来说,它们是正确的方法。您需要注意订购,但除此之外,应该没问题。

    【讨论】:

    • 请阅读的人注意:除非有人为这次投票提供了充分的理由,否则重要的是要注意我没有错 - 为此目的,触发器比游标好得多,并且保持平衡 - transaction-entry 有点奇怪。
    • 我没有投反对票,但你的方法是错误的。请注意,该表是临时的。既然可以在脚本中愉快地做到这一点,为什么我还要用触发器做幕后工作。
    • 我没有注意到它是临时的;您使用触发器来执行此操作,因此您始终保持最新状态。然后,当您想在给定范围内运行查询时,您只需这样做(因为您有历史数据)。您的方法使得在给定点插入新行(用于重新计算)变得困难。
    猜你喜欢
    • 2018-10-05
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多