sql - 如何计算每列中有多少个空值?
问题描述
我有一个像这样的表A:
col1
col2
col3
1
0
null
null
null
null
3
null
null
null
5
1
我想在Oracle 10G中得到这样的输出:
column_name
null_count
col1
2
col2
2
col3
3
我使用UNION ALL实现了这一点,如下所示:
select "col1" column_name,sum(case when col1 is null then 1 else 0 end) as null_count from A group by "col1"
union all
select "col2" column_name,sum(case when col2 is null then 1 else 0 end) as null_count from A group by "col2"
union all
select "col3" column_name,sum(case when col3 is null then 1 else 0 end) as null_count from A group by "col3";
它运行良好,但需要花费大量时间,因为有近 100 个UNION ALL。我想在不使用UNION ALL的情况下实现相同的输出。
有没有办法在不使用UNION ALL的情况下实现这一目标?
解决方案
您可以为此使用 UNPIVOT(我不确定古代 Oracle 10 是否已经支持该功能 - 我已经十多年没有使用它了)
select colname, count(*) - count(val) as num_nulls
from t1
UNPIVOT include nulls
(val for colname in (col1 as 'C1',
col2 as 'C2',
col3 as 'C3'))
group by colname
order by colname;
不确定这是否更快。
在线示例:https ://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=4e807b8b2d8080abac36574f776dbf04
推荐阅读
- python - 合并 3 个深度网络并端到端训练
- virtualbox - 增加虚拟盒虚拟磁盘的大小
- vb.net - 是否有一个函数可以在 vb.net 中的 2 个字符串之间获取字符串
- jquery - Jquery函数(文件加载)按顺序
- python - 使用 python3.8 部署 Blazor
- mysql - 防止 PHP 将数组数据写入 /tmp 文件夹
- amazon-web-services - 配置 CloudWatch Secret Manger 事件以触发另一个 lambda 函数
- powershell - CMD管道与Powershell管道不同?
- json - 以最高读取性能存储和查询复杂的 JSON/XML
- php - 以最少的移动有效地将 2D 矩阵中的 1 实例翻转为 0