如何编写SQL查询,在日期范围内展示无记录日期的0统计值
解决MySQL指定日期范围无记录日期显示0计数的问题
你当前的查询 SELECT COUNT(*), created_date FROM my_table GROUP BY created_date; 仅返回存在数据记录的日期统计结果,无记录的日期会直接缺失,导致统计图不完整。针对MySQL 8.0及以上版本(2018年4月发布,已支持递归CTE),可以用以下方案补全所有日期并显示0计数:
递归生成日期范围+左联统计
WITH RECURSIVE date_range AS ( -- 定义日期范围起始点:示例为当月第一天,可替换为指定起始日期 SELECT DATE_FORMAT(CURRENT_DATE, '%Y-%m-01') AS date_day UNION ALL -- 递归生成后续日期,直到范围结束点:示例为当月最后一天 SELECT DATE_ADD(date_day, INTERVAL 1 DAY) FROM date_range WHERE date_day < LAST_DAY(CURRENT_DATE) ) -- 左联原表统计每日数据量 SELECT dr.date_day AS created_date, COUNT(t.created_date) AS total_count FROM date_range dr LEFT JOIN my_table t ON dr.date_day = t.created_date GROUP BY dr.date_day ORDER BY dr.date_day;
代码说明
RECURSIVECTE负责生成指定范围内的所有连续日期,示例为当月,你可按需修改起始和结束条件:比如要生成2024-01-01到2024-01-10的日期,就把起始日期改成'2024-01-01',结束条件改成date_day < '2024-01-11'- 左联
my_table后,无匹配记录的日期对应的t.created_date为NULL,COUNT(t.created_date)会自动忽略NULL值,返回0 - 按日期排序保证结果是连续的日期序列
关于旧线程的说明
此前有旧线程提及MySQL不支持递归,但MySQL 8.0及以上版本已支持递归CTE语法,现在可直接用上述方案解决问题。
内容的提问来源于stack exchange,提问作者Michael Cropper
相关产品推荐
相关产品推荐

