Oracle统计多张表的Count数的和
需求描述:
Table1: job1
job1_id name status other_column
1file1process…
2file2failed…
3file3success…
Table2: job2
job2_id name status other_column
1fileA new…
2fileB success…
3fileC failed…
统计这两张表总共的成功(success)数,失败(failed)数,正在解析(process,包含new)数,结果返回⼀张表,像这样:status amount
process3
success2
failed2
Oracle SQL写法:
Step1:
分别统计两张表各⾃的process, success, failed的count,只需要group by⼀下再count即可:
select status, count(*) amount from job1 group by status;
select status, count(*) amount from job2 group by status;
结果:
status amount
process1
success1
failed1
(上图表job1,下图表job2)
status amount
new2
success1
failed1
Step2:
将两张表融合起来,group by⼀下再对每个分组分别sum⼀下就可以计算出各⾃status的总数,但会遇到⼀个问题,new怎么add到process中?
> ⽤oracle的decode函数,即在查上⾯的count的时候,就把new的value给改成process(当然只是视图的改变,不会改变表原来的值)。这⾥只需要对表job2稍作修改:
select decode(status, 'new', 'process',
'success', 'success',
'failed', 'failed') status,
count(*) amount from job2 group by status;
> decode的⽤法:decode(字段名,原来的值,改变后的值,原来的值,改变后的值……),请注意,不需要改变的也要写上去,如上⾯
的'success', 'success',否则都会变成空。
正确结果:
status amount
process2
sql中union多表合并success1
failed1
如果只写了decode(status, 'new', 'process') status,就会变成:
status amount
process2
1
1
Step3:
⾄此,可以融合了。⽤union all关键字将上⾯分别count后的表融合成⼀张表,再group by和sum。
> 这⾥不要⽤union,如果缺省all,则合并结果会去掉相同的项,因为我们两张表分别有success 1和success 1,重复了,若被去掉其中⼀项,就没有效果了,所以应该使⽤union all,⽽且注意union左右两边的表不要加括号,否则会报语法错误。另外这⾥⽤到with关键字将上⾯count后的表作为临时表⽅便总表调⽤。全部代码如下:
with table_sum as(
select status, count(*) amount from job1 group by status
union all
select decode(status, 'new', 'process', 'success', 'success', 'failed', 'failed') status,        count(*) amount from job2 group by status
) select status, sum(amount) amount from table_sum group by status;
结果:
status amount
process3
success2
failed2
Over :).

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。