带重置的SQL运行总计
我有一张有日期和交易记录的桌子。我需要计算运行总数(这将很容易与总和分区),除了它需要重置为零时,“金额”中有负值,然后再次开始计算运行总数。有什么想法吗 account|amount| date |total| 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 账户|金额|日期|总计| 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,sql-server,Sql,Sql Server,我有一张有日期和交易记录的桌子。我需要计算运行总数(这将很容易与总和分区),除了它需要重置为零时,“金额”中有负值,然后再次开始计算运行总数。有什么想法吗 account|amount| date |total| 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
使用更新变量方法,您可以使用重置选项计算运行总计
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;
declare@tblItems表(
ID int标识(1,1),
金额小数(12,3),
RunningTotal十进制(12,3)默认值(0)
)
插入@tblItems(金额)
价值观
(50),
(20),
(-100),
(5),
(10)
;
声明@RunningTotal decimal(12,3)=0;
更新@tblItems
设置@RunningTotal=RunningTotal=case当数量您看到否时,他说如果遇到一行为负数,他想从0重新开始求和。您的解决方案假定数据库系统按照您插入行的顺序处理该行。这总是真的吗?是的,我同意,可能是这样。但通常情况下,报告中经常使用运行总计,我认为出于报告目的,通常没有庞大的数据表。就像我在许多报告中所做的那样,首先使用ORDERBY子句在temp表中提取报告的数据(当然,这不是一个很大的表)。这是一个直截了当的工作。我发现了一篇关于使用聚集索引进行排序的好文章: