如何在GROUP BY查询中找出计数为0的缺失ID记录?
解决方法:显示指定列表中所有ID的计数(包括无匹配的0)
这个问题我碰过好多次啦,核心问题在于你的原始查询里,WHERE子句已经把没有符合条件记录的InID(也就是3851和11)完全过滤掉了——这些ID连进入GROUP BY的资格都没有,所以HAVING COUNT(*)=0根本找不到它们。
想要把指定列表里的所有ID都显示出来,哪怕对应计数是0,得换个思路:先构造包含所有目标ID的数据集,再和你的统计结果做左连接,这样就能保留所有ID,再把空值替换成0就行。
具体实现代码
这里用CTE(公共表表达式)先定义你要查询的所有目标ID,再和原统计结果左连接:
WITH TargetIDs AS ( -- 构造包含所有要查询的InID的虚拟表 SELECT InID FROM (VALUES (3851), (4151), (11)) AS Temp(InID) ) SELECT t.InID, -- 把NULL的计数替换成0 COALESCE(r.ICount, 0) AS ICount FROM TargetIDs t -- 左连接确保保留所有目标ID,哪怕右边没有匹配的统计结果 LEFT JOIN ( -- 你的原始统计查询 SELECT InID, COUNT(*) as ICount FROM RawData WHERE CompletedDate>= @BeginDate AND CompletedDate<= @EndDate AND InID in (3851,4151,11) GROUP BY InID ) r ON t.InID = r.InID;
如果你的数据库不支持VALUES语法(比如部分老版本的MySQL),可以用UNION ALL来构造TargetIDs:
WITH TargetIDs AS ( SELECT 3851 AS InID UNION ALL SELECT 4151 UNION ALL SELECT 11 ) -- 后面的左连接部分和上面一致
为什么这个方法有效?
TargetIDs里包含了你要查询的所有InID,作为左连接的左表,会被完整保留下来- 左连接后,没有匹配统计结果的ID(3851和11)对应的
r.ICount会是NULL - 用
COALESCE函数把NULL替换成0,就得到了你想要的“0计数”结果
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

