【问题标题】:Return column names and count of their distinct values in MySQL返回列名和它们在 MySQL 中不同值的计数
【发布时间】:2018-08-21 17:12:59
【问题描述】:

我正在寻找一个动态 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 Server count number of distinct values in each column of a table

Return column name and distinct values

SQL: count number of distinct values in every column

【问题讨论】:

  • 这在 sql 中很困难,因为您的字段的结果集可能会非常不同,并且 MySQL 处理数据记录,而不是列。这意味着必须逐行构造输出。由于 MySQL 不支持完全外连接,因此构造这个输出有点棘手。我认为与 MySQL 相比,在应用程序中组装预期结果要容易得多。

标签: mysql sql distinct-values


【解决方案1】:

我只需要与这个问题类似的东西(获取所有表不同值的计数以及仅使用 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;

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 2011-08-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多