SQL считает различные значения и считает нулевые значения для всех столбцов в таблице - PullRequest
0 голосов
/ 24 мая 2019

У меня есть таблица tbl_site с 50 столбцами.Я хочу написать некоторый код SQL, который будет подсчитывать количество различных значений и количество нулевых значений для каждого столбца без необходимости запускать оператор для каждого столбца.

Я понимаю, что это может включать выполнение вложенного запросаto information_schema.columns, но я не уверен, как построить запрос дальше.Кроме того, нулевые значения будут включать значения '' и '', если это возможно.

Желаемый результат будет следующим:

Column      | Distinct | Null
site_id     | 100      | 0
sitearea_id | 12       | 0
site_area   | 54       | 5
etc....

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Да, я заметил, что это MySQL после того, как я написал скрипт для SQL Server ... но в любом случае вот код на тот случай, если кому-то это понадобится ... или если вы узнаете, как это сделать

declare @position int = 1,
        @sql nvarchar(max),
        @columnCnt int,
        @currentColumn nvarchar(50),
        @TableName nvarchar(50) = 'YourTableName',
        @DBName nvarchar(50) = 'YourDbName';

if (OBJECT_ID('tempdb..#MyRowCount')) IS NOT NULL DROP TABLE #MyRowCount
CREATE TABLE #MyRowCount (ColumnName nvarchar(50), DistinctCount int, NullCount int)

set @columnCnt = (select MAX(ORDINAL_POSITION) from INFORMATION_SCHEMA.COLUMNS 
                  where TABLE_NAME = @TableName and TABLE_CATALOG = @DBName)

WHILE (@position <= @columnCnt)
BEGIN

    set @currentColumn = (select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS 
                          where TABLE_NAME = @TableName and 
                                TABLE_CATALOG = @DBName and 
                                ORDINAL_POSITION = @position)

    set @sql = 'INSERT INTO #MyRowCount (ColumnName, DistinctCount, NullCount)
                  SELECT ''' + @currentColumn + ''', 
                 (SELECT COUNT(DISTINCT [' + @currentColumn + ']) FROM ' + @TableName + ' where [' + @currentColumn + '] IS NOT NULL), 
                 (SELECT COUNT(*) FROM ' + @TableName + ' where [' + @currentColumn + '] IS NULL)';

    -- print @sql;

    execute (@sql);

    set @position = @position + 1;

END

SELECT * FROM #MyRowCount
0 голосов
/ 24 мая 2019

В MySQL вы можете построить запрос, используя:

set @sql = '
select ''[column]'' as col, count(distinct "[column]"), sum("[column]" is null)
from [table] t
';

select group_concat(replace(replace(@sql, '[table]', table_name), '[column]', column_name) separator ' union all ')
from information_schema.columns
where table_name = ?;

Предостережение в этом подходе заключается в том, что вы должны быть уверены, что значение максимальной длины group_concat достаточно велико (по умолчанию 1024 вон 'очень далеко).

Затем вы можете скопировать запрос, используя prepare / execute для его запуска.

0 голосов
/ 24 мая 2019

Попробуйте комбинацию подсчета различных значений и суммы:

SELECT Column, count(distinct Column) as 'Distinct'
,sum(case when Column is null then 1 else 0 end) as 'Null'
FROM  tbl_site
GROUP BY 1
...