J'ai une table appelée tbl_site avec 50 colonnes. Je souhaite écrire un code SQL qui comptera le nombre de valeurs distinctes et le nombre de valeurs nulles pour chaque colonne sans avoir à exécuter une déclaration pour chaque colonne.
Je comprends que cela inclurait éventuellement exécuter une requête imbriquée à l'information_schema. colonnes mais je ne suis pas sûr sur la façon de construire la requête plus loin. Les valeurs nuls incluraient également des valeurs «et» si possible. P>
La sortie souhaitée serait la suivante: p>
Column | Distinct | Null site_id | 100 | 0 sitearea_id | 12 | 0 site_area | 54 | 5 etc....
3 Réponses :
Essayez un mélange de comptage DISTINCT et SUM Case:
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
Ouais, j'ai remarqué que c'est MySQL après avoir fait un script pour SQL Server ... Mais de toute façon, voici le code au cas où quelqu'un en a besoin ... ou si vous avez une idée de savoir comment le faire
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
dans mysql, vous pouvez construire la requête en utilisant:
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 = ?;
Quel moteur SQL utilisez-vous?
Pouvez-vous fournir un échantillon d'entrée et une sortie attendue?
J'utilise MySQL et exigez la sortie que j'ai spécifiée ci-dessus