mysql - 返回列名及其在 MySQL 中的不同值的计数

标签 mysql sql distinct-values

我正在寻找一个动态 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 从任何表中获取它的简单方法)所以我用这种方式做到了。希望它可以在这种情况下对某人有所帮助。

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;

关于mysql - 返回列名及其在 MySQL 中的不同值的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49256308/

相关文章:

MySQL 计数为 {name} 和 WHERE {name} = X,未知列

mysql - COUNT 与 IF FROM DISTINCT 值 MySQL

php - 将函数结果传递到sql

mysql - 使用 in 子句连接两个表

java - 将 jspinner 时间值插入数据库

sql - 获取错误 "function week(timestamp without time zone) does not exist"

java - 批处理管道上的不同操作

xpath - 为什么不同值不会在非原子化序列上产生不同的值

php - 通过 PHP + JSON 从 MySql 获取状态

php - 如何从现有数据库更新 Symfony 实体?