我有一个具有以下结构的表:
yyyymm Revenue
... ...
201701 450
201701 600
201702 350
... ...
201903 559
我希望查询以以下形式返回:
yyyymm TTM Revenue
201701 Sum of Revenue from 201601 to 201612
201702 Sum of Revenue from 201602 to 201701
... ...
我尝试使用:
select yyyymm, sum(case when ...) from table group by 1
但是我无法弄清楚逻辑和语法。有人可以帮我吗?
答案 0 :(得分:0)
您需要累计金额:
select t.*,
sum(revenue) over (order by yyyymm rows between 12 preceding and 1 preceding) as trailing_12_months_revenue
from t;
这需要连续12个月的数据 (按书面规定)。如果您缺少几个月,可以为此进行修改。
答案 1 :(得分:0)
我不知道这是否对您有帮助,但这将是Microsoft Sql Server的方法,减去等式的12个月部分,如果在T-Sql中需要一点点工作,该日期将以这种格式存储,以将其转换为日期,并在该日期上运行where。
CREATE TABLE #temp (yyyymm int, revenue int)
INSERT INTO #temp
(
yyyymm,
revenue
)
VALUES
(201701, 450), (201701, 600), (201702,350)
SELECT
yyyymm,
SUM(revenue)
From #temp
GROUP BY #temp.yyyymm
DROP TABLE #temp
答案 2 :(得分:0)
最简单的方法是使用子选择(我称您的表foo
):
select
foo.*,
(select sum(revenue) from
foo ly
where
ly.yyyymm between foo.yyyymm - 100 and foo.yyyymm - 1
) as last_years_revenue
from foo;
这将产生以下结果:
输入:
yyyymm | revenue
--------+---------
201701 | 450
201701 | 600
201702 | 350
201601 | 45
201601 | 60
201602 | 35
yyyymm | revenue | last_years_revenue
--------+---------+--------------------
201701 | 450 | 140
201701 | 600 | 140
201702 | 350 | 1085
201601 | 45 | NULL
201601 | 60 | NULL
201602 | 35 | 105
2016年的收入为60 + 35 + 45 = 140。
2017-02的收入为450 + 600 + 35 = 1085。