【问题标题】:SQL Running total with reset带重置的 SQL 运行总计
【发布时间】:2018-01-25 12:50:13
【问题描述】:

我有一张包含日期和交易的表格。我需要计算运行总计(使用 sum 分区很容易),除非当“金额”中有负值时它需要重置为零,然后再次开始计算运行总计。有什么想法吗?

账户|金额|日期|总计|
123456 |50 |2017-01-01 00:00:00|50
123456 |50 |2017-01-02 00:00:00|100
123456 |100 |2017-01-03 00:00:00|200
123456 |-50 |2017-01-04 00:00:00|0
123456 |100 |2017-01-05 00:00:00|100
123456 |100 |2017-01-06 00:00:00|200

【问题讨论】:

标签: sql sql-server


【解决方案1】:

使用更新变量方法,您可以使用重置选项计算运行总计。

declare @tblItems table(
 ID int identity(1, 1),
 Amount decimal(12, 3),
 RunningTotal decimal(12, 3) default(0)
)

insert into @tblItems(Amount)
values
 (50),
 (20),
 (-100),
 (5),
 (10)
;

DECLARE @RunningTotal decimal(12, 3) = 0;

UPDATE @tblItems
SET @RunningTotal = RunningTotal = case when amount<0 then 0 else (@RunningTotal + Amount) end
FROM @tblItems;

SELECT ID, Amount, RunningTotal
FROM @tblItems
ORDER BY ID;

【讨论】:

  • 您的解决方案假定数据库系统按照您插入行的顺序处理行。总是如此吗?
  • 同意,可能就是这样。但通常情况下,报表中经常使用运行总计,我认为出于报表目的通常没有庞大的数据表。就像我在许多报告中所做的那样,首先使用 order by 子句提取临时表中的报告数据(当然不会很大)。那么这是一项直截了当的工作。
  • 我发现了一篇关于使用聚集索引进行排序的好文章:sqlsunday.com/2014/06/29/inline-variable-assignment-in-update
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多