2016-09-05 11 views
6

次のような異なるタイプのデータ(ビットからnvarcharまたはdatetimeのいずれか)を持つ未知数のカラム(および未知のカラム名も含む)を持つテーブルがある:未知数のカラムでSQLの空のセルをカウントする

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

私はすべての列のすべてのNULLと空のセルをカウントし、このように結果を出力するクエリを必要とする:私は、動的クエリとUNPIVOTを使用する必要があることを理解

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

が、私のSQLの知識それはどこにもありません!

How to count all NULL values in a table?は、MS SQL

、それはMySQLの関係していると動作しないようではありません
+0

可能な複製[テーブル内のすべてのNULL値をカウントする方法?](http://stackoverflow.com/questions/2295318/how-to-count-all -null-values-in-a-table) – webmaster

+1

@webmaster、あなたの可能な複製*は 'SQLサーバー 'に対して実行されている間に' MySQL'用です – Shnugo

+0

ありがとう、ありがとうございます。 – webmaster

答えて

3

あなたは、この動的な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 [email protected] AND [email protected] 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 [email protected] AND [email protected] AND c.DATA_TYPE LIKE '%char%' 
     FOR XML PATH('') 
     ),1,6,'') 
); 
exec (@DynamicSelect2) 
+0

Nullを含むように2番目の動的クエリを編集しなければならなかった(私は結果を単一の表形式で必要とした)が、魅力のように働いた、ありがとう! – espressionist

0

EDIT:この回答は、MySQLためである(最初は慎重に読んでいない)

this answerから、私はこれを考えますその結果、あなたのすべての「ヌル」セルをカウントします:

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 [email protected] and [email protected]; 

-- 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 [email protected] and [email protected]; 
-- 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; 
+0

すぐにお返事ありがとうございますが、あなたの答えはMySQLを参照していて、MSSQLで動作しないようです。 – espressionist

+0

ああ、すみません、私は間違って推測しました。警告をありがとう。 – webmaster

1

ここでは、NULL値または空の値を持つフィールドをテーブルから戻す方法があります。
unpivotを使用して動的クエリを生成して実行します。
は、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; 
+0

自分でテストしたところ、NULLでうまく動作しますが、空のセルも含める必要があります。 – espressionist

+0

@ espressionist確かに、私はそれを見落としました。今修正されました。今では、空のテキストを含むものやスペースしか含まないものも数えます。私はRTRIMをち​​ょうど追加しましたが、テスト中に空白だけのvarcharのLENも0に等しいことがわかりました。面白い小さなT-SQLクワック。 – LukStorms

関連する問題