SQL Server如何查询显示所有级别含零值在内的计数结果集
问题原因
你现有写法的问题出在三处:
- 对
Counsnet关联表的过滤条件写在了HAVING子句中:LEFT JOIN无匹配时关联表的字段全部为NULL,会被HAVING的等值条件直接过滤,相当于把LEFT JOIN降级成了INNER JOIN,自然不会返回计数为0的级别 - 统计计数用了
COUNT(M.Id):主表Master_Levels的Id永远非空,就算没有关联匹配也不会返回0 GROUP BY中包含了关联表的字段,无匹配时的NULL值会生成无效分组,进一步干扰结果
修正后的SQL语句
SELECT M.Desc AS LevelDescription, COUNT(C.LevelId) AS Counts FROM Master_Levels M LEFT JOIN Counsent C ON M.Id = C.LevelId AND C.IsAccepts = 'Yes' AND C.ProcedureId = 3 WHERE M.Id IN (1, 2, 3, 4) GROUP BY M.Desc, M.Id
修正说明
- 把关联表的过滤条件移到
LEFT JOIN的ON子句中,仅关联符合要求的记录,无匹配时关联表字段返回NULL,不会过滤主表的级别数据 - 计数改为统计关联表的
C.LevelId,无匹配时该字段为NULL,COUNT会自动忽略NULL值,正确返回0计数 - 去掉
GROUP BY中关联表的冗余字段,仅按主表的级别维度分组,结果结构符合预期 - 主表的Id过滤移到
WHERE子句,提前过滤无效数据,执行效率更高
内容的提问来源于stack exchange,提问作者Mugal Mehboob
相关产品推荐
相关产品推荐

