使用SQL计算多列中的NULL值

Ano*_*ose 11 sql

我有3列让说A,BC.我需要计算NULL每列中的值.

例如:

 A  | B  | C
-------------
1   |NULL| 1
1   | 1  | NULL
NULL| 1  | 1
NULL|NULL| 1
Run Code Online (Sandbox Code Playgroud)

应输出:

 A  |  B  |  C
---------------
 2  |  2  |  1
Run Code Online (Sandbox Code Playgroud)

我已经尝试过计数,求和,子查询但是没有任何东西对我有效.任何输入将不胜感激!

PM *_*7-1 22

SELECT COUNT(*)-COUNT(A) As A, COUNT(*)-COUNT(B) As B, COUNT(*)-COUNT(C) As C
FROM YourTable; 
Run Code Online (Sandbox Code Playgroud)

  • 如果表有很多列并且我不想显式地将它们全部写出来,有没有办法做到这一点? (15认同)

Tar*_*ryn 6

您可以将聚合函数与CASE表达式一起使用:

select 
  sum(case when a is null then 1 else 0 end) A,
  sum(case when b is null then 1 else 0 end) B,
  sum(case when c is null then 1 else 0 end) C
from yt
Run Code Online (Sandbox Code Playgroud)

演示


hkr*_*itz 6

对于 SQL SERVER,您可以使用以下内容:

SET NOCOUNT ON
DECLARE @Schema NVARCHAR(100) = '<Your Schema>'
DECLARE @Table NVARCHAR(100) = '<Your Table>'
DECLARE @sql NVARCHAR(MAX) =''
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls

CREATE TABLE #Nulls (TableName sysname, ColumnName sysname , ColumnPosition int ,NullCount int , NonNullCount int)

 SELECT @sql += 'SELECT  '''+TABLE_NAME+''' AS TableName , '''+COLUMN_NAME+''' AS ColumnName,  '''+CONVERT(VARCHAR(5),ORDINAL_POSITION)+''' AS ColumnPosition, SUM(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) CountNulls , COUNT(' +COLUMN_NAME+') CountnonNulls FROM '+QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+';'+ CHAR(10)
 FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_SCHEMA = @Schema
 AND TABLE_NAME = @Table

 INSERT INTO #Nulls 
 EXEC sp_executesql @sql

 SELECT * 
 FROM #Nulls

 DROP TABLE #Nulls
Run Code Online (Sandbox Code Playgroud)

您将收到一个结果集,其中包含表的每一列中的 Null 值和非 Null 值的计数

  • 这个答案很好,但要注意“COLUMN_NAME”没有被引用,因此可以通过替换“QUOTENAME(COLUMN_NAME)”来改进,以支持带有空格、保留字等的列名。(我自己会进行更改,但编辑队列已满) (4认同)