如何用SQL查询获取全年1到52周完整数据 包含无记录周的补全结果
解决方案
要实现全年周数的完整输出,核心是先构造1-52周的连续序列,再和业务查询结果做左连接,无匹配的周自动补默认值即可。
具体实现(以SQL Server为例,适配你原语句使用的DATEPART语法)
WITH weeks AS ( -- 递归生成1-52周的连续序列 SELECT 1 AS week_num UNION ALL SELECT week_num + 1 FROM weeks WHERE week_num < 52 ), biz_data AS ( -- 原业务逻辑改造,显式JOIN可读性更强 SELECT DATEPART(week, ad.created_date) AS week, COUNT(ad.activity_type_config_id) AS count, ud.full_name AS name FROM activity_detail ad INNER JOIN activity_type_config atc ON ad.activity_type_config_id = atc.activity_type_config_id INNER JOIN activity_user ud ON ud.activity_user_id = ad.activity_user_id WHERE ad.created_date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY DATEPART(week, ad.created_date), ud.full_name ) -- 周序列左关联业务数据,补全缺失值 SELECT w.week_num AS week, ISNULL(b.count, 0) AS count, b.name FROM weeks w LEFT JOIN biz_data b ON w.week_num = b.week ORDER BY w.week_num
注意事项&适配说明
- 原查询的日期范围仅覆盖到2021年11月17日,若要统计全年数据需将日期范围调整为当年1月1日到12月31日
- MySQL 8.0+:CTE语法通用,将
DATEPART(week, xxx)改为WEEK(xxx),ISNULL改为IFNULL即可 - 低版本MySQL:可预先创建一张存储1-52数字的周数辅助表,替代上述CTE的weeks部分
- 需注意跨年周的规则定义,可根据业务需求调整周函数的参数,匹配企业周统计规则
内容的提问来源于stack exchange,提问作者Cross DEV
相关产品推荐
相关产品推荐

