英文:
SQL Pivot - Months as Column headers
问题
我有一个SQL查询,如下所示:
select year(recvd_date), 
    sum(case when month(recvd_date)=1 then count(distinct(app_id)) else 0 end) as Jan,
    sum(case when month(recvd_date)=2 then count(distinct(app_id)) else 0 end) as Feb,
    sum(case when month(recvd_date)=3 then count(distinct(app_id)) else 0 end) as Mar,
    sum(case when month(recvd_date)=4 then count(distinct(app_id)) else 0 end) as Apr,
    sum(case when month(recvd_date)=5 then count(distinct(app_id)) else 0 end) as May,
    sum(case when month(recvd_date)=6 then count(distinct(app_id)) else 0 end) as Jun,
    sum(case when month(recvd_date)=7 then count(distinct(app_id)) else 0 end) as Jul,
    sum(case when month(recvd_date)=8 then count(distinct(app_id)) else 0 end) as Aug,
    sum(case when month(recvd_date)=9 then count(distinct(app_id)) else 0 end) as Sep,
    sum(case when month(recvd_date)=10 then count(distinct(app_id)) else 0 end) as Oct,
    sum(case when month(recvd_date)=11 then count(distinct(app_id)) else 0 end) as Nov,
    sum(case when month(recvd_date)=12 then count(distinct(app_id)) else 0 end) as Dec
from schema.app_table
--where year(recvd_date) = 2023
group by year(recvd_date)
它会给出以下期望的格式:
year(recvd_date)    Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
2023                66     45     21     22     10     9      8      0      0      0      0      0
请注意,我已将每个月份的计数相加,以便它们出现在同一行,并且对于其他月份,我将它们填充为零。
英文:
I have a SQL written as below:
select year(recvd_date), 
(case when month(recvd_date)=1 then count(distinct(app_id)) else 0 end) as Jan,
(case when month(recvd_date)=2 then count(distinct(app_id)) else 0 end) as Feb,
(case when month(recvd_date)=3 then count(distinct(app_id)) else 0 end) as Mar,
(case when month(recvd_date)=4 then count(distinct(app_id)) else 0 end) as Apr,
(case when month(recvd_date)=5 then count(distinct(app_id)) else 0 end) as May,
(case when month(recvd_date)=6 then count(distinct(app_id)) else 0 end) as Jun,
(case when month(recvd_date)=7 then count(distinct(app_id)) else 0 end) as Jul,
(case when month(recvd_date)=8 then count(distinct(app_id)) else 0 end) as Aug,
(case when month(recvd_date)=9 then count(distinct(app_id)) else 0 end) as Sep,
(case when month(recvd_date)=10 then count(distinct(app_id)) else 0 end) as Oct,
(case when month(recvd_date)=11 then count(distinct(app_id)) else 0 end) as Nov,
(case when month(recvd_date)=12 then count(distinct(app_id)) else 0 end) as Dec
from schema.app_table
--where year(recvd_date) = 2023
group by year(recvd_date), month(recvd_date)
It is giving me the right numbers but the format is not exactly what I expect. The numbers appear on different rows and zero filled for other months. How can I achieve the below format.
Expected Format:
year(recvd_date)	Jan 	Feb		Mar		Apr		May		Jun		Jul
2023				66		45		21		22		10		9		8
答案1
得分: 1
这可以通过使用条件聚合来完成:
select year(recvd_date), 
count(distinct case when month(recvd_date) = 1 then app_id end) as 一月,
count(distinct case when month(recvd_date) = 2 then app_id end) as 二月,
....
from schema.app_table
-- where year(recvd_date) = 2023
group by year(recvd_date)
在此处测试过MySQL:https://dbfiddle.uk/WbY_jC_W
英文:
This can be done using the conditional aggregation :
select year(recvd_date), 
count(distinct case when month(recvd_date) = 1 then app_id end) as Jan,
count(distinct case when month(recvd_date) = 2 then app_id end) as Feb,
....
from schema.app_table
-- where year(recvd_date) = 2023
group by year(recvd_date)
Tested on mysql here : https://dbfiddle.uk/WbY_jC_W
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论