使用另一列分组时按月滚动季度计算



我正试图计算季度时间段的滚动百分比。通过sql获取的示例数据如下:

create table #demo (Month char(7), Type varchar(10), Mileage int);
--low
insert into #demo values ('2021-05', 'low', 5000);
insert into #demo values ('2021-06', 'low', 15000);
insert into #demo values ('2021-07', 'low', 3000);
insert into #demo values ('2021-08', 'low', 3500);
-- med
insert into #demo values ('2021-05', 'med', 6789);
insert into #demo values ('2021-06', 'med', 12876);
insert into #demo values ('2021-07', 'med', 1578);
insert into #demo values ('2021-08', 'med', 3500);

--high
insert into #demo values ('2021-05', 'high', 5000);
insert into #demo values ('2021-06', 'high', 1500);
insert into #demo values ('2021-07', 'high', 2700);
insert into #demo values ('2021-08', 'high', 2968);
Month   Type    Mileage
2021-05 high    5000
2021-05 low     5000
2021-05 med     6789
2021-06 high    1500
2021-06 low     15000
2021-06 med     12876
2021-07 high    2700
2021-07 low     3000
2021-07 med     1578
2021-08 high    2968
2021-08 low     3500
2021-08 med     3500

我的目标是利用这些数据,分别计算每个类别滚动3个月的百分比。

的例子:对于2021年的前3个月,我希望得到2021-05年、2021-06年、2021-07年的总和(低里程)、总和(中里程)、总和(高里程),然后将每个总和除以这三个月的总和(所有类别)。我想象一个主解是最理想的。我只是不知道该怎么做。

所以我希望看到这样的滚动总数:

Month    ThreeMonth_TotalMileage ThreeMonth_Low  ThreeMonth_Med ThreeMonth_High
2021-05  NULL                    NULL            NULL           NULL
2021-06  NULL                    NULL            NULL           NULL
2021-07  53443                   23000           21243          9200
2021-08  46622                   18800           17954          7168

。ThreeMonth_TotalMileage是2021-05、2021-06和2021-07年度所有里程的总和。这将只显示为2021-07年的运行总数,因为我们有3个月的历史记录,我们可以从中计算总和,否则我希望它为空。

3Month_Low是2021-05、2021-06、2021-07年所有低里程的总和,基本上包括当前月份加上前两个月的每个计算。

有什么想法,我可以尝试使用SQL Server来完成这个吗?谢谢你!

您可以使用有序分析函数来实现。目的是求累加和。

对于从行到列的数据透视,您可以使用CASEMAX

select
Month
,Max(case when Type='low' then Mileage end)  as Month_Low
,Max(case when Type='med' then Mileage end)as Month_Med
,Max(case when Type='high' then Mileage end)  as Month_High
,case when ROW_NUMBER() over(order by Month asc)>=3 Then 1 end as is_3month_data_present
from #demo
group by month
<表类>月Month_LowMonth_MedMonth_Highis_3month_data_presenttbody><<tr>2021 - 05500067895000空2021 - 06年15000128761500空2021 - 07年30001578270012021 - 08年3500350029681

相关内容

  • 没有找到相关文章

最新更新