基于数据列运行总计

时间:2014-04-21 22:07:49

标签: sql sql-server sql-server-2008-r2

我有一个临时表,其中包含基于每天的帐户余额变化结果。

DateValue  DailyAmount
---------- ---------------------------------------
2014-04-21 0.00
2014-04-22 606.28
2014-04-23 -70.00
2014-04-24 -86.96
2014-04-25 -101.01
2014-04-26 -27.00
2014-04-27 0.00
2014-04-28 -75.00
2014-04-29 -12.00
2014-04-30 0.00
2014-05-01 -164.00
2014-05-02 -49.95
2014-05-03 0.00
2014-05-04 0.00
2014-05-05 -140.00
2014-05-06 538.23
2014-05-07 -70.00
2014-05-08 223.04
2014-05-09 0.00
2014-05-10 -50.00
2014-05-11 0.00
2014-05-12 -140.00
2014-05-13 -12.00
2014-05-14 0.00
2014-05-15 6179.81

我需要从这个表中选择,根据我有的期初余额变量添加一个运行余额。

选择是否安全,并使用Dateadd(DAY,-1,Datefield)以某种方式加入它的自我?

我失败的尝试(错误的结果)是:

SELECT DateValue, ISNULL(r.Amount,0) AS DailyAmount, SUM(ISNULL(r.Amount,0))
FROM calendar c
LEFT JOIN @Result r
ON r.TheDate = c.DateValue
LEFT JOIN @Result r2
ON r2.TheDate = DATEADD(day, -1, r.TheDate)
WHERE c.DateValue BETWEEN @Start AND @End
GROUP BY c.DateValue, r.Amount

SQL版本是Microsoft SQL Server 2008 R2(SP2)

2 个答案:

答案 0 :(得分:2)

在SQL中获取运行总计的典型方法是使用相关子查询:

select r.*,
       (select sum(r2.DailyAmount)
        from @Result r2
        where r2.DateValue <= r.DateValue
       ) as CumSum
from @Result r;

您可能需要子查询中的其他条件,例如匹配客户。并且,SQL Server 2012直接支持累积总和。

答案 1 :(得分:0)

SQLPerformace.com上运行总计的不同策略进行了广泛的讨论。

如果你只有每日参赛作品而不是任何解决方案,那么表演不会成为一个问题。我只是为了它而展示了与戈登不同的东西。

;WITH x AS
(
    SELECT TOP 1 
        DateValue
       ,DailyAmount
       ,RunningTotal = DailyAmount
         FROM #Result
        ORDER BY DateValue ASC
    UNION ALL
    SELECT y.DateValue
       ,y.DailyAmount
       ,x.RunningTotal + y.DailyAmount
         FROM x 
        INNER JOIN 
        #Result y ON y.DateValue = DATEADD(DAY, 1, x.DateValue)
)
SELECT DateValue
      ,DailyAmount
      ,RunningTotal
    FROM x
    ORDER BY DateValue
OPTION (MAXRECURSION 10000)