MySQL查询实现全周期全活动计数求和 无匹配记录显示0
问题根源
原有SQL以slm_activities作为主表做左连接,仅能返回已经存在业务关联记录的「活动+评分周期」组合,无法生成所有活动、所有周期的全量组合集合,必然会缺失无匹配数据的组合行。
实现逻辑
- 首先通过交叉连接(
CROSS JOIN)关联activities表(全量活动类型)和periods表(全量评分周期),生成3类活动*4个周期共12行的全量基础组合,这是保证不缺失组合的核心 - 以全量基础组合作为主表,左连接
slm、slm_activities表的实际业务数据,未匹配到的业务记录对应count字段会返回null - 聚合求和时通过
COALESCE函数将null值转换为0,最终按活动、周期分组输出结果
正确SQL语句
SELECT COALESCE(SUM(sa.count), 0) AS activitycount, a.activity, p.period FROM activities a CROSS JOIN periods p LEFT JOIN slm s ON s.period = p.period LEFT JOIN slm_activities sa ON sa.slmid = s.id AND sa.activity = a.id GROUP BY a.activity, p.period ORDER BY a.activity, p.id;
执行结果说明
基于给出的存量数据,执行上述SQL会返回12行记录,完全符合需求:
- quiz在1st Grading Period计数为5,其余3个周期计数为0
- lesson在2nd Grading Period计数为6,其余3个周期计数为0
- page在4个评分周期的计数均为0
内容的提问来源于stack exchange,提问作者user6001531
相关产品推荐
相关产品推荐

