簡體   English   中英

SQL計算未知列數中的空單元格

[英]SQL count empty cells in unknown number of columns

我有一個表,其中的列數未知(也有未知的列名),具有不同類型的數據(可以是從位到nvarchar或datetime的任何數據),如下所示:

ID   | Col2 | Col3 | Customer |  ..(etc)..
1    | NULL |  0   |  CustA   |    
2    | valA |  1   |  NULL    |
3    | valB | NULL |  (empty) |

我需要一個查詢,該查詢對每一列上的所有NULL和空單元格進行計數,並輸出如下結果:

Column_Name  |  No_Of_Empty_And_Null_Cells | 
   Col2      |             1               |
   Col3      |             1               |
 Customer    |             2               |
 (etc...)    |                             |

我知道我必須使用動態查詢和UNPIVOT,但是我的SQL知識遠不止於此!

如何計算表中的所有NULL值? 似乎不起作用,因為它與MySQL有關,而不與MS SQL有關

您可以嘗試以下動態SQL代碼:

DECLARE @schema VARCHAR(100)='dbo';
DECLARE @tableName VARCHAR(100)='SomeTable';

DECLARE @DynamicSelect VARCHAR(MAX)=
(
  STUFF((SELECT 'UNION SELECT ''' + COLUMN_NAME + ''' AS COLUMN_NAME' + 
         ', (SELECT COUNT(*) FROM ' + @schema + '.' + @tableName + ' WHERE [' + COLUMN_NAME + '] IS NULL) AS No_Of_Null_Cells '
         FROM INFORMATION_SCHEMA.COLUMNS AS c
         WHERE c.TABLE_SCHEMA=@schema AND c.TABLE_NAME=@tableName AND c.IS_NULLABLE='YES'
         FOR XML PATH('')
        ),1,6,'')
);
exec (@DynamicSelect)


DECLARE @DynamicSelect2 VARCHAR(MAX)=
(
  STUFF((SELECT 'UNION SELECT ''' + COLUMN_NAME + ''' AS COLUMN_NAME' + 
         ', (SELECT COUNT(*) FROM ' + @schema + '.' + @tableName + ' WHERE LTRIM(RTRIM([' + COLUMN_NAME + '])) ='''') AS No_Of_Empty_Cells '
         FROM INFORMATION_SCHEMA.COLUMNS AS c
         WHERE c.TABLE_SCHEMA=@schema AND c.TABLE_NAME=@tableName AND c.DATA_TYPE LIKE '%char%'
         FOR XML PATH('')
        ),1,6,'')
);
exec (@DynamicSelect2)

這是一種從表返回具有空值或空值的字段的方法。
通過生成並執行帶有動態數據的動態查詢。
在SQL Server 2014上測試。

DECLARE @SchemaName SYSNAME = 'YourDatabase';
DECLARE @TableName SYSNAME = 'YourTable';

DECLARE @SQL NVARCHAR(MAX);

WITH COL AS (
    SELECT c.name
    FROM sys.objects o
    INNER JOIN sys.schemas s ON o.[schema_id] = s.[schema_id]
    INNER JOIN sys.columns c ON o.[object_id] = c.[object_id]
    WHERE o.[type] = 'U'
      AND s.name = @SchemaName 
      AND o.name = @TableName
      AND c.is_nullable = 1
)
SELECT @SQL = 'SELECT up.column_name, up.total_empty 
FROM (
 SELECT ' + CHAR(13) + STUFF((
    SELECT CHAR(13) + ', ' + QUOTENAME(name) + ' = SUM(IIF(LEN(RTRIM(' + QUOTENAME(name) + '))>0,0,1))'
    FROM COL
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, ' ') + '
 FROM ' + QUOTENAME(@SchemaName) + '.' + QUOTENAME(@TableName) + ') q
 UNPIVOT
 (total_empty for column_name in ('+
  STUFF((
    SELECT CHAR(13) + ', ' + QUOTENAME(name) FROM COL
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, ' ')
   +')
) up where up.total_empty > 0 order by up.column_name';

--SELECT @SQL;
EXEC sys.sp_executesql @SQL;

編輯:這個答案是針對MySQL (起初沒有仔細閱讀)

這個答案中 ,我認為這個結果將計算您所有的“空”單元格:

SET @db = 'your_database_name'; -- database
SET @tb = 'your_table_name'; -- table
SET @x = ''; -- will hold the column names with ASCII method applied to retrieve the number of the first char
SET @numcolumns = 0; -- will hold the number of columns in the table

-- figure out how many columns we have
SELECT count(*) into @numcolumns FROM information_schema.columns where table_name=@tb and table_schema=@db;

-- we have to prepare some query from all columns of the table
SELECT group_concat(CONCAT('ASCII(',column_name,')')) into @x from information_schema.columns where table_name=@tb and table_schema=@db;
-- after this query we have a variable separated with comma like
-- ASCII(col1),ASCII(col2),ASCII(col3)

-- we now generate a query to concat the columns using comma as separator (null values are omitted from concat)
-- then figgure out how many times the comma is in that substring (this is done by using length(value)-length(replace(value,',',''))
-- the number returned is how many non null columns we have in that column
-- then we deduct the number from the known number of columns, calculated previously
-- the +1 is added because there is no comma for single value
SET @s = CONCAT('SELECT @numcolumns - (length(CONCAT_WS(\',\',', @x, '))-length(replace(CONCAT_WS(\',\',', @x, '),\',\',\'\')) + 1) FROM ',@db,'.',@tb,';');
PREPARE stmt FROM @s;
EXECUTE stmt;
-- after this execution we have returned for each row the number of null columns
-- I will leave to you to add a sum() group call if you want to find the null values for the whole table
DEALLOCATE PREPARE stmt;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM