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,有
对于批次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语句并合并所有结果.
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)
| 归档时间: |
|
| 查看次数: |
7448 次 |
| 最近记录: |