【问题标题】:MySQL COUNT NULL content by column, GROUP by columnMySQL 按列计数 NULL 内容,按列分组
【发布时间】:2026-01-07 15:10:01
【问题描述】:

如何按字段/列计算非空条目?我看到了几个按行计算的答案,但无法破解如何对列进行计数。

输入:

╔════╦════════╦════════╦════════╗
║ id ║ field1 ║ field2 ║ field3 ║
║ 1  ║ do     ║ re     ║ me     ║
║ 2  ║ fa     ║        ║ so     ║
║ 3  ║ la     ║ te     ║        ║
║ 4  ║ da     ║ re     ║        ║
╚════╩════════╩════════╩════════╝

输出:

id       4
field1   4
field2   3
field3   2

我正在尝试衡量我正在迁移的一个非常脏的数据库中的字段使用情况。这个数据库中有大约 50 列,所以我正在寻找一种不涉及输入每个列名的方法。

由于数据存储的不一致,我可能还必须将该搜索扩展到非 NULL & is-not-empty & ≠ 0 & ≠ “no”——有些字段从未使用过,而是自动填充了“no”。

这个答案看起来很接近我的需要,但会产生一个 SQL 错误,我没有足够的声誉来发表评论:Count number of NULL values in each column in SQL

【问题讨论】:

  • 更新:我使用的是 MySQL 而不是 SQL,如果这有影响的话。

标签: mysql sql count null field


【解决方案1】:

只需使用count():

select count(field1), count(field2), count(field3)
from table t;

count() 就是这样做的——它计算非 NULL 值。

如果您不喜欢输入名称,请使用元数据表(通常为 information_schema.columns)来获取列名。您可以将 SQL 生成为查询,或将列名复制到电子表格中以生成代码。

编辑:

您可以使用以下代码生成代码:

select group_concat('count(', column_name, ')' separate ', ')
from information_schema.columns
where table_name = <whatever> and table_schema = <whatever2>;

请注意,这使用了 group_concat() 鲜为人知的能力来获取多个字符串参数。

【讨论】:

  • @gordon linoff,我认为用户想要的是行数据,而不是列数据。
  • 运行此程序时出现 SQL 语法错误。我应该在某处用我的表名替换 table t 吗?还有 50 个列名,我正在寻找一种编程方式来运行它,而无需手动输入每个名称。
  • @Gorden,“如果您不喜欢输入名称,请使用元数据表(通常是 information_schema.columns)来获取列名。您可以将 SQL 生成为查询... " 我知道如何使用 count()。弄清楚如何通过 SQL 查询获取列名是我所缺少的。您可以编辑您的答案以包含它吗?
  • @Gordon 的答案最终是正确的,我当时太新了,无法理解。并赞扬使用 SQL 输出新查询语言的元答案。
【解决方案2】:
SELECT count(field1) as cnt ,'field1' as field from tbl where field1 IS NOT NULL
UNION all
SELECT count(field2) as cnt ,'field2' as field from tbl where field2 IS NOT NULL
union all 
SELECT count(field3) as cnt ,'field3' as field from tbl where field3 IS NOT NULL

如果 SQL 之上只有 3 个固定字段将起作用

【讨论】:

  • 大约有 50 个字段。如果我想将它们全部输入,这将起作用。
  • 你真的不需要UNION ALL,除非某些列名相同,这是不可能的。
【解决方案3】:

这里是sqlfiddle

SELECT
  COUNT(id),
  SUM(CASE WHEN field1 IS NOT NULL THEN 1 ELSE 0 END), 
  SUM(CASE WHEN field2 IS NOT NULL THEN 1 ELSE 0 END), 
  SUM(CASE WHEN field3 IS NOT NULL THEN 1 ELSE 0 END)
FROM table1;

【讨论】: