如何按字段/列计算非空条目?我看到几个按行计数的答案,但不能破解如何对列进行操作。
输入:
╔════╦════════╦════════╦════════╗
║ 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&不是空的& ≠0&由于数据存储不一致,≠“no” - 某些字段从未使用过,但自动填充为“no”。
这个答案看起来很接近我的需要,但会产生SQL错误,我没有足够的声誉来评论:Count number of NULL values in each column in SQL
答案 0 :(得分:3)
只需使用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()
能力来获取多个字符串参数。
答案 1 :(得分: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个固定字段将工作
答案 2 :(得分:0)
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;