Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带重置的SQL运行总计_Sql_Sql Server - Fatal编程技术网

带重置的SQL运行总计

带重置的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

我有一张有日期和交易记录的桌子。我需要计算运行总数(这将很容易与总和分区),除了它需要重置为零时,“金额”中有负值,然后再次开始计算运行总数。有什么想法吗

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
使用更新变量方法,您可以使用重置选项计算运行总计

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表中提取报告的数据(当然,这不是一个很大的表)。这是一个直截了当的工作。我发现了一篇关于使用聚集索引进行排序的好文章: