您好社区以下查询添加每个事件状态的出现次数,然后按月对它们进行分组
select
date_format(date_created, '%b') month,
month(date_created) pivot,
sum(case when a.state = 'created' then 1 else 0 end) created,
sum(case when a.state = 'notified' then 1 else 0 end) notified,
sum(case when a.state = 'confirmed' then 1 else 0 end) confirmed,
sum(case when a.state = 'approved' then 1 else 0 end) approved,
sum(case when a.state = 'authorized' then 1 else 0 end) authorized,
sum(case when a.state = 'attended' then 1 else 0 end) attended,
sum(case when a.state = 'canceled' then 1 else 0 end) canceled,
count(a.id) as total
from activities a
group by 1 order by pivot desc;
所以我得到以下结果
我想在此结果中添加没有数据的月份,并自动补全状态总和为零
我分享这个sqlfiddle
我找到了这个answer到类似的场景,但我不明白如何将其应用到我向您展示的案例
非常感谢您的帮助
最佳答案
您可以使用日期表(子查询)和LEFT JOIN
:
select
s.name month,
s.m pivot,
sum(case when a.state = 'created' then 1 else 0 end) created,
sum(case when a.state = 'notified' then 1 else 0 end) notified,
sum(case when a.state = 'confirmed' then 1 else 0 end) confirmed,
sum(case when a.state = 'approved' then 1 else 0 end) approved,
sum(case when a.state = 'authorized' then 1 else 0 end) authorized,
sum(case when a.state = 'attended' then 1 else 0 end) attended,
sum(case when a.state = 'canceled' then 1 else 0 end) canceled,
count(a.id) as total
from (SELECT 1 m, 'Jan' AS name
UNION SELECT 2, 'Feb'
UNION SELECT 3, 'Mar'
UNION ...) s
LEFT JOIN activities a
ON s.m = month(date_created)
--AND s.y = year(date_created) -- if needed
group by 1
order by pivot desc;
<强> DBFiddle Demo
关于mysql - 按月列出分组数据,包括没有结果的月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47600790/