SQL按指定列分组统计多列空值数量的实现方法咨询
解法说明
- 你提到的转长表再统计的思路是完全可行的,列数较多时可以采用该方案配合PIVOT实现需求,但列数较少时有更简单的实现方式,不需要做转置操作。
最简实现:条件聚合(适配所有SQL版本)
直接在聚合函数里加判断条件即可,不需要修改表结构,性能最优:
SELECT A, SUM(CASE WHEN B = '' THEN 1 ELSE 0 END) AS B, SUM(CASE WHEN C = '' THEN 1 ELSE 0 END) AS C FROM `table1` GROUP BY A
注:如果你的空值是SQL标准NULL而非空字符串,将判断条件替换为
B IS NULL、C IS NULL即可。
转长表+PIVOT的实现方案(适合统计列数较多的场景)
如果你需要统计的列很多,不想重复写CASE WHEN语句,可以采用你提到的思路,先UNPIVOT转成长表,再统计后PIVOT转回宽表,以MySQL 8.0+为例示例代码如下:
SELECT * FROM ( -- 按分组统计各列空值数 SELECT A, col_name, COUNT(*) AS empty_cnt FROM ( -- unpivot转长表 SELECT A, col_name, col_value FROM `table1` UNPIVOT ( col_value FOR col_name IN (B, C) -- 此处填写所有要统计的列名 ) AS unpvt ) t WHERE col_value = '' -- 空值为NULL时替换为col_value IS NULL GROUP BY A, col_name ) t PIVOT ( MAX(empty_cnt) FOR col_name IN (B, C) -- 此处填写所有要统计的列名 ) AS pvt
内容的提问来源于stack exchange,提问作者J. G.
相关产品推荐
相关产品推荐

