Oracle SQL中不使用GROUP BY子句时如何使用COUNT函数
Oracle SQL 无GROUP BY子句时COUNT函数的使用方案
首先明确:COUNT本身是聚合函数,默认不写GROUP BY时,会将整个匹配WHERE条件的数据集作为一个分组聚合,返回单行结果,本身就是合法用法。常见的使用场景和实现如下:
基础用法:单维度计数
直接调用COUNT函数即可,不需要额外加GROUP BY:
-- 统计整张表的总记录数 SELECT COUNT(*) FROM education; -- 统计满足过滤条件的记录数 SELECT COUNT(*) FROM education WHERE status = 'APPROVED';
进阶用法:同一句SQL统计多个不同维度的计数
如果需要同时返回多个不同过滤规则的计数值,不需要GROUP BY,有两种常用实现:
方案1:标量子查询实现(对应参考示例)
每个维度的计数单独写一个返回单个值的子查询,放到SELECT字段列表中即可:
SELECT COUNT(*) AS "Total orders", NVL( (SELECT COUNT(*) FROM education WHERE status='APPROVED'), 0 ) AS "Number of approved requests" FROM education
逻辑说明:外层COUNT统计全表总记录数,子查询单独统计审批通过的记录数,外层套NVL是为了避免没有匹配记录时返回空值,兜底返回0。
方案2:CASE表达式配合COUNT实现(更推荐,性能更优)
该方案只需要扫描一次表,比标量子查询的多表扫描效率更高:
SELECT COUNT(*) AS "Total orders", COUNT(CASE WHEN status = 'APPROVED' THEN 1 END) AS "Number of approved requests" FROM education
逻辑说明:CASE表达式只会把满足status='APPROVED'的行返回非空值,COUNT计数时会自动忽略空值,从而得到符合条件的记录数,不需要额外加GROUP BY。
内容的提问来源于stack exchange,提问作者Noorhan Ahmed
相关产品推荐
相关产品推荐

