如何在MySQL中用GROUP BY按月份汇总不同类型的请假天数?
问题解决思路及修改后的SQL
你的问题出在两个核心点:
GROUP BY同时包含MONTH(covered_from)和leave_type,导致同一个月份会按请假类型拆分成多条记录- SELECT使用
*会带出具体日期值,而非你需要的月份名称
修改后的SQL如下(以MySQL为例):
SELECT CASE MONTH(covered_from) WHEN 1 THEN '一月' WHEN 2 THEN '二月' WHEN 3 THEN '三月' WHEN 4 THEN '四月' WHEN 5 THEN '五月' WHEN 6 THEN '六月' WHEN 7 THEN '七月' WHEN 8 THEN '八月' WHEN 9 THEN '九月' WHEN 10 THEN '十月' WHEN 11 THEN '十一月' WHEN 12 THEN '十二月' END AS 日期, SUM(IF(leave_type = 'SL', number_of_days, 0)) AS sl, SUM(IF(leave_type = 'VL', number_of_days, 0)) AS vl FROM leaves WHERE `status` = 'Approved' AND `emp_id` = 'pb123' GROUP BY MONTH(covered_from) ORDER BY MONTH(covered_from)
修改说明:
- 移除
leave_type分组:仅按MONTH(covered_from)分组,确保同一个月份的所有请假记录合并,SL和VL的天数分别累加 - 替换日期显示:用
CASE语句将月份数字转换为中文名称,替代原查询中的具体日期 - 简化条件判断:直接用
leave_type = 'SL'替代STRCMP,逻辑更直观 - 添加排序:
ORDER BY MONTH(covered_from)保证结果按月份顺序排列
执行后将得到你预期的按月汇总结果:
| 日期 | SL | VL |
|---|---|---|
| 七月 | 4 | 0 |
| 八月 | 5 | 1 |
内容的提问来源于stack exchange,提问作者user20476491
相关产品推荐
相关产品推荐

