[英]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.