tSQL - 递归运行总计

时间:2016-06-13 23:31:17

标签: sql sql-server-2012

我有一些按月排序的数据。我想要做的是获得一个总计;但是,当月的总和取决于上个月的总和。 IE(当月总计)+(上个月的总和)。我有这样的数据:

DATE      Amount
04/2016    10.00
04/2016    25.00
05/2016    10.00
05/2016    15.00
06/2016    1.00
...

这样总计就会产生

DATE      Totals
04/2016    35.00
05/2016    60.00
06/2016    61.00
...

让我们说模式是umonth,表数据中的数量。我想弄清楚这个

Select umonth, LAG(SUM(Amount)) Over (Partition By umonth Order by umonth) Total from data

我知道这不会起作用,因为Sum(Amount)不是前一个月的总和+总和。救命。这是存储过程的情况吗?这样我就可以将@prevTotal设置为用游标计算到@currTotal - 请原谅我的粗言秽语。

这是在MSSQL 2012数据库上。

3 个答案:

答案 0 :(得分:5)

您可以使用聚合和累积总和来执行此操作:

select umonth, 
       sum(sum(amount)) over (order by umonth) as Totals
from data
group by umonth;

答案 1 :(得分:1)

在sql-server 2008中测试并运行。

declare @data table(Date date, amount float)

insert into @data
values('04/01/2016',10.00),
('04/01/2016',25.00),
('05/01/2016',10.00),
('05/01/2016',15.00),
('06/01/2016',1.00)

select Date, (select sum(amount) from @data d2 where d2.Date <=d1.Date) as runningTotal
from @data d1
group by date

2012年,我相信你可以做这样的事情。

    select Date, SUM(amount) over(order by Date ROWS UNBOUNDED PRECDING) as runningtotal
    from @date
group by Date

答案 2 :(得分:0)

使用无限制的LAG()结束。一旦项目范围发生显着变化,条件不再需要复杂的滚动总数,这个问题就变成了一个静音问题,允许简单的滚动总数(2012年引入了LAG()和LEAD()函数,使滚动总数更容易,在我看来)

感谢您之前的建议。