Oracle SQL查询使用GROUP BY汇总统计信息

ser*_*rna 2 sql oracle pivot group-by

我有一个Oracle表,其数据如下所示:

ID   BATCH   STATUS
1    1       0
2    1       0
3    1       1
4    2       0
Run Code Online (Sandbox Code Playgroud)

也就是说,ID是主键,每个"批处理"将有多行,每行在STATUS列中都有一个状态代码.还有很多其他专栏,但这些是重要的专栏.

我需要编写一个查询来汇总每个批次状态代码 ; 在STATUS列中有三个可能的值,0,1和2,我希望输出看起来像这样:

BATCH  STATUS0  STATUS1  STATUS2
1      2        1        0
2      1        0        0
Run Code Online (Sandbox Code Playgroud)

这些数字将是重要的; 对于批次1,有

  • STATUS设置为0的2条记录
  • 1记录STATUS设置为1,和
  • 没有STATUS设置为0的记录.

对于批次2,有

  • 1记录STATUS设置为0,和
  • 没有STATUS设置为1或2的记录.

有没有办法在一个查询中执行此操作,而无需为每个状态代码重写查询?即我可以轻松编写这样的查询,并运行三次:

SELECT batch, COUNT(status)
FROM table
WHERE status = 0
GROUP BY batch
Run Code Online (Sandbox Code Playgroud)

我可以运行它,然后再次运行status = 1,再次运行status = 2,但我希望在一个查询中执行它.

如果它有所不同,除了STATUS列之外还有另一列我可能想要以相同的方式进行汇总 - 另一个原因是我不想在SELECT语句之后执行SELECT语句并合并所有结果.

Ton*_*ews 6

select batch 
,      count(case when status=1 then 1 end) status1
,      count(case when status=2 then 1 end) status2
,      count(case when status=3 then 1 end) status3
from   table
group by batch;
Run Code Online (Sandbox Code Playgroud)

这通常被称为"数据透视"查询,我写了一篇关于如何在我的博客上动态生成这些查询的文章.

使用DECODE的版本(特定于Oracle但不那么详细):

select batch 
,      count(decode(status,1,1)) status1
,      count(decode(status,2,1)) status2
,      count(decode(status,3,1)) status3
from   table
group by batch;
Run Code Online (Sandbox Code Playgroud)