我有一个临时表,其中包含基于每天的帐户余额变化结果。
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)
答案 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)