我正在使用SQL Server2014。我有一个包含多列的表。是否可以动态列出表中的前10列以及每列中记录为NULL的百分比?我不想对每个列名称进行硬编码。
所以结果集将像:
Column Percent_Null
ABC 100
QWE 75
REW 65
TRW 50
我从下面开始,但是如何在列表中得到它呢?最终,需要将结果放入表格中进行报告。
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = STUFF((
SELECT ', CAST(SUM(CASE WHEN ' + Quotename(C.COLUMN_NAME) + ' IS NULL THEN 1 ELSE 0 END) * 100.00
/@TotalCount AS INT) AS [' + C.COLUMN_NAME + ' NULL %]
'
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE TABLE_NAME = 'tblMYTable'
AND TABLE_SCHEMA = 'dbo'
ORDER BY C.ORDINAL_POSITION
FOR XML PATH('')
,type
).value('.', 'nvarchar(max)'), 1, 2, '')
PRINT @SQL
Blargh,这很丑陋,但它似乎可以满足您的要求:
DECLARE @Table sysname = N'icp_yyclient',
@Schema sysname = N'dbo';
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'WITH Counts AS(' + @CRLF +
N' SELECT ' +
STUFF((SELECT N',' + @CRLF +
N' (COUNT(CASE WHEN ' + QUOTENAME(C.[name]) + N' IS NULL THEN 1 END) * 1.) / COUNT(*) AS ' + QUOTENAME(c.[name] + N'_PercNULL')
FROM sys.schemas s
JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
WHERE s.name = @Schema
AND t.name = @Table
ORDER BY c.column_id
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,14,N'') + @CRLF +
N' FROM ' + QUOTENAME(@Schema) + N'.' + QUOTENAME(@Table) + N')' + @CRLF +
N'SELECT TOP(10) V.*' + @CRLF +
N'FROM Counts C' + @CRLF +
N' CROSS APPLY(VALUES' +
STUFF((SELECT N',' + @CRLF +
N' (N' + QUOTENAME(C.[name],'''') + N', C.' + QUOTENAME(c.[name] + N'_PercNULL') + N')'
FROM sys.schemas s
JOIN sys.tables t ON s.schema_id = t.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
WHERE s.name = @Schema
AND t.name = @Table
ORDER BY c.column_id
FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,26,N'') + N')V(ColumnName,ColumnPercNULL)' + @CRLF +
N'ORDER BY V.ColumnPercNULL DESC;';
--SELECT @SQL; --PRINT is limited to 4,000 characters, so probably too small.
EXEC sp_executesql @SQL;