欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ORACLE多条件统计查询的简单方法

程序员文章站 2022-03-16 20:29:59
前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析。一开始便想到了union和if语句,然后写了1000多行代码,就为了查30条数据觉得不应该。 然后就...

前几天要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析。一开始便想到了union和if语句,然后写了1000多行代码,就为了查30条数据觉得不应该。

然后就开始百度,多种条件下的统计。然后有一种语法让我眼前一亮,case when then else end

当满足case设定的条件时,就可以执行then语句。由于我要做的分组查询统计,是要罗列每一种情况,而且根据输入的“管理员编号”不同返回不同结果,结果记录的条数和每一种情况是可知的,这个语法完全可用

核心代码如下:

select substr(a.业务,1,2) 行政区域,substr(a.业务,3,length(a.业务)-2) 业务模块,a.已结案,a.办理中,a.案件总数,
round(a.已结案 /decode(a.案件总数, 0, 9999,a.案件总数), 4) * 100 || '%' 完成率

from

(select '市级律师服务' 业务,

1 排序,

sum(case when 区县代码 is null and (trunc(委托时间, 'dd') between v_sjq and v_sjz) and 申请状态代码 in ('ztdm1','ztdm2') then 1 else 0 end) 已结案,

sum(case when 区县代码 is null and (trunc(委托时间, 'dd') between v_sjq and v_sjz) and 申请状态代码 not in ('ztdm1','ztdm2') then 1 else 0 end) 办理中,

sum(case when 区县代码 is null and (trunc(委托时间, 'dd') between v_sjq and v_sjz) and 申请状态代码 is not null then 1 else 0 end) 案件总数

from ta_律师申请委托

)a

where a.排序 in(v_排序1,v_排序2,v_排序3,v_排序4,v_排序5)

order by  a.排序;

通过排序号,来控制不同管理员查询的数据范围不同:

 v_排序1 integer;
 v_排序2 integer;
 v_排序3 integer;
 v_排序4 integer;
 v_排序5 integer;
-----------------------------
 select 
decode(p_管理员编号,'test1',2,
    'test2',3,
    'test3',4,
    'test4',5
 ) into v_排序1 from dual;
v_排序2:=v_排序1+6;
v_排序3:=v_排序1+12;
v_排序4:=v_排序1+18;
v_排序5:=v_排序1+24;

总结

目前测试数据量不大,优化前后性能差别不明显,但是代码行数减少了3倍以上,可读性明显增强,少了很多if判断,理论上复杂度减少很多。

以上就是本文关于oracle多条件统计查询的简单方法的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅: 、 、oracle分页查询性能优化代码详解 等,有什么问题可以随时留言,小编会及时回复大家。感谢朋友们对网站的支持!