如何在Azure Synapse专用SQL池生成按年月拆分的客户收入表?
背景信息
客户表存储了每位客户的信息、订阅类型,以及基于订阅类型的会员开始日期、下次付款日期等数据,表结构及示例数据如下:
客户表:
| Customer_ID | Charge_ID | Membership_Type | Membership_StartDate | Membership_EndDate | Membership_Status | Next_Payment_Date | Gross |
|---|---|---|---|---|---|---|---|
| cus_OzcGFMWjj7e6wf | ch_3OBd1JJuo27Vzw6d0tzOgF7c | Membership £216 Yearly | 2023-11-12 | NULL | Active | 2024-11-12 | £216.00 |
| cus_OynI9WYzFKG7ZJ | ch_3OApgkJuo27Vzw6d0bOJgdYf | Membership £5 Monthly | 2023-11-10 | NULL | Active | 2023-12-10 | £5.00 |
| cus_OzAOs3xIx4p3vd | ch_3OBC21Juo27Vzw6d1AGyK9LQ | Membership £5 Monthly | 2023-11-11 | NULL | Active | 2023-12-11 | £5.00 |
| cus_OzXKT687CWwQuS | ch_3OBYFiJuo27Vzw6d1FmiNkGm | Membership £5 Monthly | 2023-11-12 | NULL | Active | 2023-12-12 | £5.00 |
| cus_OzNXmqgA4I7zy2 | ch_3OBOkMJuo27Vzw6d0neOzJ13 | Membership £10 Monthly | 2023-11-11 | NULL | Active | 2023-12-11 | £10.00 |
需求
需在Azure Synapse专用SQL池中创建名为Revenue的表,按客户、年度、月度拆分展示确认收入与递延收入,目标表结构及示例数据如下:
收入表(Revenue Table):
| Customer_ID | Customer_Name | Membership_Type | Year | January | February | March | April | May | June | July | August | September | October | November | December |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cus_OzcGFMWjj7e6wf | ch_3OBd1JJuo27Vzw6d0tzOgF7c | Membership £216 Yearly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 11.21311475 | 18.29508197 |
| cus_OzcGFMWjj7e6wf | ch_3OBd1JJuo27Vzw6d0tzOgF7c | Membership £216 Yearly | 2024 | 18.29508197 | 17.1147541 | 18.29508197 | 17.70491803 | 18.29508197 | 17.70491803 | 18.29508197 | 18.29508197 | 17.70491803 | 18.29508197 | 6.491803279 | NULL |
| cus_OynI9WYzFKG7ZJ | ch_3OApgkJuo27Vzw6d0bOJgdYf | Membership £5 Monthly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 3.5 | 1.5 |
| cus_OzAOs3xIx4p3vd | ch_3OBC21Juo27Vzw6d1AGyK9LQ | Membership £5 Monthly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 3.333333333 | 1.666666667 |
| cus_OzXKT687CWwQuS | ch_3OBYFiJuo27Vzw6d1FmiNkGm | Membership £5 Monthly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 3.166666667 | 1.833333333 |
| cus_OzNXmqgA4I7zy2 | ch_3OBOkMJuo27Vzw6d0neOzJ13 | Membership £10 Monthly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 6.666666667 | 3.333333333 |
| cus_P087tismWgTMyM | ch_3OC7qDJuo27Vzw6d0hOuCQT2 | Membership £54 Yearly | 2023 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 2.454545455 | 4.227272727 |
| cus_P087tismWgTMyM | ch_3OC7qDJuo27Vzw6d0hOuCQT2 | Membership £54 Yearly | 2024 | 4.227272727 | 3.954545455 | 4.227272727 | 4.090909091 | 4.227272727 | 4.090909091 | 4.227272727 | 4.227272727 | 4.090909091 | 4.227272727 | 4.090909091 | 1.636363636 |
当前进展与问题
已编写单个客户的收入计算脚本(以cus_OzcGFMWjj7e6wf为例),代码如下:
declare @Membership_StartDate date; declare @Membership_EndDate date; declare @Gross INT; set @Membership_StartDate = '2023-11-12'; set @Membership_EndDate = '2024-11-12'; set @Gross = 216.000000; With FirstQuery AS ( select year(dt) [Year], month(dt) [Month], count(*) NumberofDays from (select top(datediff(d, dateadd(dd,-1,@Membership_StartDate), dateadd(dd,-1,@Membership_EndDate))) dateadd(d, row_number() over (order by (select null)), dateadd(dd,-1,@Membership_StartDate)) dt from sys.columns) q group by year(dt), month(dt) ) select Year , Jan = MAX(case when Month = 1 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Feb = MAX(case when Month = 2 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Mar = MAX(case when Month = 3 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Apr = MAX(case when Month = 4 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , May = MAX(case when Month = 5 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Jun = MAX(case when Month = 6 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Jul = MAX(case when Month = 7 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Aug = MAX(case when Month = 8 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Sep = MAX(case when Month = 9 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Oct = MAX(case when Month = 10 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Nov = MAX(case when Month = 11 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) , Dec = MAX(case when Month = 12 then (1.0*NumberofDays)/(1.0*DATEDIFF(day, @Membership_StartDate, @Membership_EndDate))*(1.0*@Gross) end) from FirstQuery group by Year
请求指导如何将该脚本适配客户表中的所有客户,以生成目标Revenue表。
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

