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

SQL查询中NULL值计数显示为0的问题排查求助

问题:Discipline字段NULL值计数显示为0,实际存在至少50条NULL记录

我想要统计各Discipline的总数,但查询结果中NULL值的计数显示为0,我已确认至少存在50条含NULL值的记录,以下是我的SQL代码及查询结果截图:

SELECT Discipline,count(Discipline) as num
    FROM table A AS [M]
        RIGHT JOIN        
           table B
         AS [P]
            ON [M].column1 = P.column1 COLLATE DATABASE_DEFAULT
        LEFT JOIN table C AS [L]
            ON [L].column1 = [P].column1 COLLATE DATABASE_DEFAULT
        LEFT JOIN
        (
            SELECT ID,
                   ROW_NUMBER() OVER (PARTITION BY [KEY_ID] ORDER BY [DATE] DESC) AS [RN]
            FROM table D
           
        ) AS [S]
            ON [S].ID = [L].ID
               AND [S].[RN] = 1
              
    GROUP BY 
             [M].[Discipline]

查询结果截图:
查询结果

我不理解为什么NULL的计数是0,它应该至少为50。


原因分析

问题核心出在count(Discipline)的使用逻辑上:

  • count(列名)的特性是仅统计该列值不为NULL的行数,当Discipline字段为NULL时,这条记录不会被计入统计结果。
  • 你的查询使用了RIGHT JOIN table B,当table A(别名M)中没有匹配table B(别名P)的记录时,M.Discipline会返回NULL,此时count(Discipline)就会返回0,而这些正是你要统计的NULL分组对应的记录。
解决方法

把count(Discipline)替换成count(*)、count(1),或者用一个不会为NULL的关联列(比如count(P.column1)),就能统计包括NULL分组在内的所有记录数:

修改后的SQL示例:

SELECT Discipline,count(*) as num
    FROM table A AS [M]
        RIGHT JOIN        
           table B
         AS [P]
            ON [M].column1 = P.column1 COLLATE DATABASE_DEFAULT
        LEFT JOIN table C AS [L]
            ON [L].column1 = [P].column1 COLLATE DATABASE_DEFAULT
        LEFT JOIN
        (
            SELECT ID,
                   ROW_NUMBER() OVER (PARTITION BY [KEY_ID] ORDER BY [DATE] DESC) AS [RN]
            FROM table D
           
        ) AS [S]
            ON [S].ID = [L].ID
               AND [S].[RN] = 1
              
    GROUP BY 
             [M].[Discipline]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:35:12