SQL查询无匹配记录时返回0的实现求助
问题解决:SQL无匹配记录时返回0的实现方案
首先说明你遇到的错误原因:你收到的Cannot perform an aggregate function on an expression containing an aggregate or a subquery错误,是因为尝试在一个聚合函数(比如MAX)中嵌套另一个聚合函数(比如COUNT)。SQL不允许聚合函数嵌套使用,聚合函数只能作用于非聚合的表达式。
以下是两种针对不同需求的解决方案:
场景1:仅针对特定Status和Area Name统计
如果只需要统计Status='Failed'且Area Name包含Frozen的记录,无匹配时返回一行Count=0的结果,直接去掉GROUP BY并手动指定常量列即可:
SELECT COUNT(Status) AS Count, 'Failed' AS Status, [Area Name] FROM dbo.aspx_Inspection WHERE [Area Name] LIKE '%Frozen%' AND Status='Failed' AND DATEDIFF(day,[Assigned Date],GETDATE()) between 0 and 360
说明:即使没有匹配行,COUNT(Status)会返回0,同时Status和[Area Name]会显示指定值,确保返回一行结果。
场景2:覆盖所有包含Frozen的Area Name
如果需要列出所有Area Name包含Frozen的区域,无论该区域是否存在Failed记录都返回Count值(无记录时为0),可以用LEFT JOIN构造分组:
SELECT COALESCE(t.InspectionCount, 0) AS Count, g.Status, g.[Area Name] FROM ( -- 先获取所有包含Frozen的Area Name,固定Status为Failed SELECT DISTINCT 'Failed' AS Status, [Area Name] FROM dbo.aspx_Inspection WHERE [Area Name] LIKE '%Frozen%' ) AS g LEFT JOIN ( -- 原统计逻辑,只返回有Failed记录的分组 SELECT COUNT(Status) AS InspectionCount, Status, [Area Name] FROM dbo.aspx_Inspection WHERE [Area Name] LIKE '%Frozen%' AND Status='Failed' AND DATEDIFF(day,[Assigned Date],GETDATE()) between 0 and 360 GROUP BY Status, [Area Name] ) AS t ON g.Status = t.Status AND g.[Area Name] = t.[Area Name] ORDER BY g.Status desc
说明:
- 子查询
g生成所有需要统计的分组(每个含Frozen的Area Name + Status='Failed') - 子查询
t生成有实际Failed记录的统计结果 LEFT JOIN确保每个分组都被列出,无匹配的分组用COALESCE将NULL转为0
内容的提问来源于stack exchange,提问作者Jake
相关产品推荐
相关产品推荐

