用于重建历史总计的T-SQL递归查询

时间:2013-07-24 19:56:19

标签: tsql sql-server-2008-r2

寻找一种在我拥有最终数据时生成历史数据“快照”的方法,以及每周对数据的更改。

我在表CurrentData:

中有这些数据
CurrentDate   CurrentAmount
--------------------------
2013-07-24        400

我还在表ChangeData中有这些数据:

ChangeDate    ChangeAmount
--------------------------
2013-07-23        -2
2013-07-22        -4
2013-07-21        10
2013-07-20         1

我希望能够随着时间的推移显示数据的样子。例如:

TotalDate     TotalAsOfThisDate
--------------------------------
2013-07-24        400
2013-07-23        402
2013-07-22        406
2013-07-21        396
2013-07-20        395

理解我必须每天根据前一天的数据构建总数,我尝试了大量不同的东西,游标,临时表等。想知道如何在SQL中构建这种类型的视图。我正在运行SQL Server 2008R2。

2 个答案:

答案 0 :(得分:0)

这可能不是性能最佳的查询,但应该适用于小型表:

SELECT CurrentDate as TotalDate, CurrentAmount as TotalAsOfThisDate
FROM CurrentData
UNION ALL
SELECT ChangeDate, (SELECT CurrentAmount from CurrentData)  
                  -(SELECT SUM(ChangeAmount) 
                    FROM ChangeData cd2 
                    WHERE cd2.ChangeDate >= cd1.ChangeDate)
FROM ChangeData cd1
ORDER BY TotalDate DESC

答案 1 :(得分:0)

你可以使用OVER子句和CTE来获取技巧....

  ;WITH Source AS (
        SELECT  CurrentDate , CurrentValue FROM CurrentData
        UNION   
        SELECT  ChangeDate , -ChangeAmount FROM ChangeData  )

SELECT CurrentDate,  SUM(CurrentValue)   
OVER (ORDER BY CurrentDate DESC)
FROM Source