每个帐户每月运行总计

时间:2016-04-25 11:52:19

标签: sql

我创建了下表:

create table AccountBalances (
    Year varchar(255),
    Period varchar(255),
    Account numeric,
    Amount numeric
)

Insert into AccountBalances(Year, Period, Account, Amount)
    Values ('2014', '1', '1210', '100'),
           ('2014', '1', '1210', '200'),
           ('2014', '3', '1210', '100')

现在我想计算每个帐户的每个期间的运行总计。但是,主要问题可能是计算没有交易的期间的运行总计。我希望我的结果如下:

Year     Period     Account     Amount
2014        1         1210        300
2014        2         1210        300
2014        3         1210        400

从交易表中,期间2不存在,但我想在我的运行总计表中计算此期间的运行总计。

3 个答案:

答案 0 :(得分:2)

从SQL Server 2012开始,您可以执行此操作

SELECT 
    *, 
    SUM(Amount) OVER (PARTITION BY Year, Account ORDER BY Period RANGE UNBOUNDED PRECEDING) 
FROM 
    AccountBalances

答案 1 :(得分:0)

系统中立(适用于所有数据库系统和版本)以及广泛使用的此类问题的方法是维护一个Date表,其中包含每行每天应用或分析的一行感兴趣的。

我相信一些数据库系统可以在运行中生成这样的东西,但是存储的表占用的空间非常小(每年365或366行 - 对于关系数据库没有任何内容)并且可以用于各种各样的情况。在未来很长一段时间内填充一次,它将为您提供良好的服务。

对于您的特定情况,您希望此Date表包含YearPeriod列:您需要确定如何定义期间,例如是一个月或其他像4周大块的时间?

然后你可以沿着这些方向进行查询(请视为伪代码 - 您的具体要求可能会有所不同):

with cteAllPeriods as (
    select      distinct
                Year
                ,Period
    from        Date
    where       Year >= 2014    -- Whatever suitable restrictions here
    )
select      D.Year
            ,D.Period
            ,AB.Account
            ,sum(AB.Amount)
from        cteAllPeriods   D
                                -- Assuming this is a running total 
                                -- from the start of the calendar year
left join   AccountBalances AB  on D.Year=AB.Year
                                and D.Period>=AB.Period -- Gets everything UP TO the current period

group by    D.Year
            ,D.Period
            ,AB.Account

答案 2 :(得分:0)

另一种方法是使用一个单独的Period_lookup表,该表具有一年的所有可能周期(月)。

然后我们可以进行外部联接,并在选择中应用IsNull / Coalesce函数以返回所需的结果。