【问题标题】:Count NULL Values from multiple columns with SQL使用 SQL 计算多列中的 NULL 值
【发布时间】:2013-05-13 18:27:00
【问题描述】:

我有 3 列,比如说 ABC。我需要计算每一列中的NULL 值。

例如:

 A  | B  | C
-------------
1   |NULL| 1
1   | 1  | NULL
NULL| 1  | 1
NULL|NULL| 1

应该输出:

 A  |  B  |  C
---------------
 2  |  2  |  1

我已经尝试过计数、求和、子查询,但还没有对我有用。任何意见将不胜感激!

【问题讨论】:

  • 什么是 RDBMS(SQL 风格)?

标签: sql


【解决方案1】:
SELECT COUNT(*)-COUNT(A) As A, COUNT(*)-COUNT(B) As B, COUNT(*)-COUNT(C) As C
FROM YourTable; 

【讨论】:

  • 如果表有很多列并且我不想明确地将它们全部写出来,有没有办法做到这一点?
【解决方案2】:

对于 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

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

【讨论】:

  • 这个答案很棒,但请注意 COLUMN_NAME 没有被引用,因此可以通过替换 QUOTENAME(COLUMN_NAME) 来支持带有空格、保留字等的列名来改进。(会做出改变我自己,但编辑队列已满)
【解决方案3】:

您可以使用带有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

Demo

【讨论】:

  • @Matthew 不需要,NULL 和为 0。
  • @JoachimIsaksson 真的吗? 1+NULL = 0?我想我有一段时间没有检查了。
  • 谢谢!有趣的是,我已经把它打出来了,当我回去工作时打算试试,但我想我还是会问。如果我知道您在其上进行演示的网站,我可以自己测试它。谢谢!
【解决方案4】:
SELECT
(SELECT count(*) FROM my_table WHERE A is NULL) as A,
(SELECT count(*) FROM my_table WHERE B is NULL) as B,
(SELECT count(*) FROM my_table WHERE C is NULL) as C

【讨论】:

    【解决方案5】:
    select
        sum(case when a is null then 1 else 0 end) as a_null_count,
        sum(case when b is null then 1 else 0 end) as b_null_count,
        sum(case when c is null then 1 else 0 end) as c_null_count
    from table
    

    【讨论】:

      【解决方案6】:

      我已经很晚了,但是如果您不想手动列出所有列名并且仍然想获取一个表,您可以在 SQL Server 中执行此操作(只需将 testTable 替换为您的实际表):

      --Creates the table the poster wanted
      
      CREATE TABLE testTable (A int, B int, C int)
      INSERT INTO testTable (A, C) VALUES (1,1)
      INSERT INTO testTable (A, B) VALUES (1,1)
      INSERT INTO testTable (B, C) VALUES (1,1)
      INSERT INTO testTable (C) VALUES (1)
      
      --Creates the output table which will consist of each column name and the amount of nulls
      
      CREATE TABLE ColumnNames (
          ID int IDENTITY(1,1) PRIMARY KEY,
          [name] varchar(max),
          nullAmount int
      )
      
      INSERT INTO ColumnNames ([name]) 
      SELECT [name] FROM sys.columns WHERE object_id = OBJECT_ID('dbo.testTable')
      
      DECLARE @columnIndex INT = 1
      
      WHILE @columnIndex <= ( SELECT COUNT(*) FROM dbo.ColumnNames )
      BEGIN
          DECLARE @colName nvarchar(max) = (SELECT [name] FROM ColumnNames WHERE ID = @columnIndex)
          EXEC('SELECT ' + @colName + ' INTO colTable FROM testTable')
      
          DECLARE @SQL nvarchar(max) = N'UPDATE ColumnNames SET nullAmount = (SELECT COUNT(1) - COUNT(' + quotename(@colName) + ') FROM colTable) WHERE ID = @columnIndex'
          EXEC SP_EXECUTESQL @SQL, N'@columnIndex int', @columnIndex 
      
          DROP TABLE colTable
          SET @columnIndex = @columnIndex + 1
      END
      
      --Select the output table and get null info
      SELECT * FROM ColumnNames
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-21
        • 2015-05-30
        • 2021-10-24
        • 2021-09-15
        • 2022-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多