Это запрос, который я придумал.Он дает не только количество строк, которые имеют значение, но также и процент от всех строк, которые имеют значение в каждом столбце.
Это характерно для одной таблицы (здесь она называется specifictable
), потому что яв то время интересовались только столбцами определенных таблиц, и было проще изменить имя таблицы в двух местах, чем заставить запрос делать все самому.
Сначала мы объявляем некоторые переменные, получаем количествоиз всех строк из specifictable
:
DECLARE @sql NVARCHAR(MAX) = N'';
DECLARE @tot INT;
SELECT @tot = COUNT(*) FROM specifictable;
Затем мы объединяем вместе большой оператор SQL UNION
, разделенный символами новой строки (CHAR(13) + CHAR(10)
).Он выбирает имя столбца, его порядок в таблице, количество строк со значением в этом столбце и процент всех строк, которые есть.
SELECT @sql += ' UNION ' + CHAR(13) + CHAR(10)
+ 'SELECT '
+ '''' + COLUMN_NAME + ''' as Col, ' + ORDINAL_POSITION + ' as OrdinalPosition, '
+ ' count(' + COLUMN_NAME + ') as NumWithVal, '
+ '(count(' + COLUMN_NAME + ') / CAST(' + CAST(@tot as varchar(20)) + ' as decimal) * 100) as Percnt '
+ 'FROM ' + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'specifictable';
Поскольку перед каждым отдельным SELECT
добавляется UNION
, мы обрезаем всю первую строку, которая содержит только «UNION
», а затем добавляем ORDER BY
.
SELECT @sql = SUBSTRING(@sql, CHARINDEX(char(10), @sql), LEN(@sql)) -- remove first line (extra union)
SELECT @sql += CHAR(13) + CHAR(10) + 'ORDER BY 3 DESC, ORDINAL_POSITION'
Наконец, он выполняется (для этого требуется разрешение EXEC sp_executesql
, которое я, к счастью, имею в этой базе данных).
EXEC sp_executesql @sql;