[英]Return column names and count of their distinct values in MySQL
我正在尋找一個動態的MySQL查詢,該查詢將對表的每一列中的不同值進行計數,並且還會告訴我哪些列包含Null值。
這是示例表,我使用“ db_name”作為數據庫名稱,並使用“ table_name”作為表名稱:
+------+------+------+------+------+
| Col1 | Col2 | Col3 | Col4 | Col5 |
+------+------+------+------+------+
| a | d | j | o | q |
| b | e | k | o | r |
| c | f | l | o | NULL |
| a | g | NULL | p | t |
| b | h | m | NULL | r |
| a | i | n | p | s |
+------+------+------+------+------+
這是我想要得到的結果集:
+----------+---------------+---------------+
| Col Name | Unique values | Contains Null |
+----------+---------------+---------------+
| Col1 | 3 | FALSE |
| Col2 | 6 | FALSE |
| Col3 | 6 | TRUE |
| Col4 | 3 | TRUE |
| Col5 | 5 | TRUE |
+----------+---------------+---------------+
到目前為止,這是我設法弄清楚的:
-- list all the column names
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_name';
-- count the distinct values in a column
SELECT COUNT(DISTINCT Col1) Col1
FROM table_name;
-- tell if a column contains any Null
SELECT
(CASE WHEN (SUM(CASE WHEN Col1 IS NULL THEN 1 ELSE 0 END)) > 0 THEN 'TRUE'
ELSE 'FALSE' END) 'Contains Null'
FROM table_name;
-- combining the queries
SELECT
(SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'table_name' AND COLUMN_NAME = 'Col1') 'Col Name',
(SELECT COUNT(DISTINCT Col1)
FROM table_name) 'Unique values',
(SELECT (CASE WHEN (SUM(CASE WHEN Col1 IS
NULL THEN 1 ELSE 0 END)) > 0 THEN 'TRUE' ELSE 'FALSE' END)
FROM table_name) 'Contains Null';
現在,我假設我需要構建一個遍歷每一列的循環,並統一查詢返回的記錄或將它們插入新表中。 問題是,我對SQL比較陌生,對循環和變量還不是很熟悉。
我發現了一些類似於我的問題,但沒有一個給我一個明確的答案:
我只需要與此問題類似的東西(獲取所有表的不同值的計數,以及僅使用SQL從任何表中獲取它的簡單方法),因此我就采用了這種方式。 希望它可以在這種情況下對某人有所幫助。
SET @processedtable := 'myprecioustablename';
SET @columnnames := (
SELECT GROUP_CONCAT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @processedtable);
SET @qrypartcount := REPLACE(@columnnames, ',','), COUNT(DISTINCT ');
SET @validquery := CONCAT("SELECT COUNT(DISTINCT ", @qrypartcount, ") FROM ", @processedtable);
PREPARE stmt FROM @validquery;
EXECUTE stmt;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.