SQL如何结合JOIN、GROUP BY与WHERE查询并保留0值统计结果
实现方法
要返回包含无业务记录name的0值统计结果,必须以存储全量name的静态配置表targets为主表做左关联,具体实现SQL如下:
SELECT t.name, t.target, COALESCE(r.record_cnt, 0) AS current FROM targets t LEFT JOIN ( SELECT name, COUNT(id) AS record_cnt FROM records WHERE MONTH(created_on) = MONTH(CURRENT_DATE()) AND YEAR(created_on) = YEAR(CURRENT_DATE()) GROUP BY name ) r ON t.name = r.name
关键逻辑点
- 左连接会保留左表
targets的全量name,不会因为右表records无对应数据就过滤掉name3这类没有产生业务记录的配置项 - 先通过子查询完成当月数据的分组统计,再和配置表关联,既可以避免直接关联原表导致的数据重复、计数错误问题,执行效率也更高
- 左连接后无匹配记录的name对应的计数字段返回值为
NULL,通过COALESCE函数将空值转换为0,即可得到正确的0统计结果
你给出的预期结果中name3的target值标注为3,和
targets表中存储的name3对应target=2的原始数据不一致,上述SQL会返回配置表中存储的真实target值。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

