我创建了下表:
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不存在,但我想在我的运行总计表中计算此期间的运行总计。
答案 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
表包含Year
和Period
列:您需要确定如何定义期间,例如是一个月或其他像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函数以返回所需的结果。