You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

说明:

  1. 子查询g生成所有需要统计的分组(每个含Frozen的Area Name + Status='Failed')
  2. 子查询t生成有实际Failed记录的统计结果
  3. LEFT JOIN确保每个分组都被列出,无匹配的分组用COALESCE将NULL转为0

内容的提问来源于stack exchange,提问作者Jake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:31:05