oracle 如何在一行中统计不同条件的结果[关闭]

kkih6yb8  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(94)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

19天前关闭。
Improve this question
我有一个像下面这样的Oracle表
| MyID|地位|所有者|日期|
| --|--|--|--|
| A001|开放|约翰| 0901 |
| A001| cncl|约翰| 0901 |
| A002|开放|约翰| 0901 |
| A002|开放|安迪| 0901 |
| A003|开放|约翰| 0901 |
| A003|开放|约翰| 0902 |
| A003|开放|约翰| 0902 |
我想要的是:
| MyID|计数(1)|计数(2)|计数(3)|计数(4)|
| --|--|--|--|--|
| A001| 2 | 1 | 2 | 2 |
| A002| 2 | 0 | 1 | 2 |
| A003| 3 | 0 | 3 | 1 |

  • count(1)是结果:myid数
  • count(2)是结果:状态为“cncl”的myid的编号
  • count(3)是结果:所有者为“John”的myid的编号
  • count(4)是结果:日期为'0901'的myid的编号

有什么简单的函数可以得到结果吗?

alen0pnh

alen0pnh1#

一种选择是使用条件聚合。
样本数据:

SQL> with test (myid, status, owner, datum) as
  2  (select
  3  'a001', 'open', 'John', '0901' from dual union all select
  4  'a001', 'cncl', 'John', '0901' from dual union all select
  5  'a002', 'open', 'John', '0901' from dual union all select
  6  'a002', 'open', 'Andy', '0901' from dual union all select
  7  'a003', 'open', 'John', '0901' from dual union all select
  8  'a003', 'open', 'John', '0902' from dual union all select
  9  'a003', 'open', 'John', '0902' from dual
 10  )

查询方式:

11  select myid,
 12    count(*),
 13    sum(case when status = 'cncl' then 1 else 0 end) cncl,
 14    sum(case when owner  = 'John' then 1 else 0 end) john,
 15    sum(case when datum  = '0901' then 1 else 0 end) datum
 16  from test
 17  group by myid
 18  order by myid;

MYID   COUNT(*)       CNCL       JOHN      DATUM
---- ---------- ---------- ---------- ----------
a001          2          1          2          2
a002          2          0          1          2
a003          3          0          3          1

SQL>

相关问题