如何编写SQL查询生成各WeekNo对应所有Id的完整统计数据?
解决方案
这是个很常见的补全维度数据的需求嘛,核心就是先构建出所有WeekNo和T1.Id的完整组合,再关联实际数据补全count值,直接给你写好SQL,再拆解下逻辑:
SELECT w.WeekNo, t1.Id, COALESCE(t2.count, 0) AS count FROM (SELECT DISTINCT WeekNo FROM T2) w CROSS JOIN T1 LEFT JOIN T2 ON w.WeekNo = T2.WeekNo AND t1.Id = T2.Id ORDER BY w.WeekNo, t1.Id;
逻辑拆解:
- 提取所有周号:子查询
(SELECT DISTINCT WeekNo FROM T2)会把T2里存在的所有不重复周号提取出来,避免重复生成相同周的记录。 - 生成全量组合:
CROSS JOIN T1会把每个周号和T1里的所有Id进行两两组合,这一步就能得到每个周对应所有5个Id的基础数据集,保证不会漏掉任何一个Id的记录。 - 关联实际数据:
LEFT JOIN T2用周号和Id作为关联条件,把全量组合和T2的实际数据关联起来——没有匹配到的记录,T2的count字段会返回NULL。 - 替换空值为0:
COALESCE(t2.count, 0)函数会把NULL值替换成0,完美符合你要求的“无对应数据时count显示为0”的需求。 - 排序:最后用
ORDER BY w.WeekNo, t1.Id让结果按周号升序、Id升序排列,和你给出的预期输出顺序完全一致。
内容的提问来源于stack exchange,提问作者alok mathur
相关产品推荐
相关产品推荐

