如何在单条SQL语句中统计Oracle表的多条件结果?
Oracle多维度分组统计实现方法
源表结构与数据
现有一张Oracle表,结构及数据如下:
| myid | status | owner | date |
|---|---|---|---|
| a001 | open | John | 0901 |
| a001 | cncl | John | 0901 |
| a002 | open | John | 0901 |
| a002 | open | Andy | 0901 |
| a003 | open | John | 0901 |
| a003 | open | John | 0902 |
| a003 | open | John | 0902 |
期望统计结果
需要按myid分组得到如下统计:
| myid | count(1) | count(2) | count(3) | count(4) |
|---|---|---|---|---|
| a001 | 2 | 1 | 2 | 2 |
| a002 | 2 | 0 | 1 | 2 |
| a003 | 3 | 0 | 3 | 1 |
统计项定义
- count(1):对应myid的总记录数
- count(2):对应myid中status为'cncl'的记录数
- count(3):对应myid中owner为'John'的记录数
- count(4):对应myid中date为'0901'的记录数
实现方案
不用复杂函数,Oracle的条件聚合就能简洁实现需求,结合GROUP BY和CASE WHEN即可完成,效率优异。
写法一:使用COUNT结合CASE WHEN
SELECT myid, COUNT(*) AS "count(1)", COUNT(CASE WHEN status = 'cncl' THEN 1 END) AS "count(2)", COUNT(CASE WHEN owner = 'John' THEN 1 END) AS "count(3)", COUNT(CASE WHEN date = '0901' THEN 1 END) AS "count(4)" FROM your_table_name -- 替换为实际表名 GROUP BY myid ORDER BY myid;
原理:当CASE条件满足时返回1,不满足则返回NULL,COUNT函数会自动忽略NULL值,最终得到符合条件的记录数。
写法二:使用SUM结合CASE WHEN
SELECT myid, COUNT(*) AS "count(1)", SUM(CASE WHEN status = 'cncl' THEN 1 ELSE 0 END) AS "count(2)", SUM(CASE WHEN owner = 'John' THEN 1 ELSE 0 END) AS "count(3)", SUM(CASE WHEN date = '0901' THEN 1 ELSE 0 END) AS "count(4)" FROM your_table_name -- 替换为实际表名 GROUP BY myid ORDER BY myid;
原理:满足条件时累加1,不满足时累加0,求和结果即为目标统计数,和写法一效果完全一致,可根据个人习惯选择。
内容的提问来源于stack exchange,提问作者Greatwall
相关产品推荐
相关产品推荐

