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
相关产品推荐
相关产品推荐

