ORACLE多条件的统计查询(casewhen)
前⼏天要做⼀个统计查询的功能,因为涉及多张表,多种条件的统计分析。⼀开始便想到了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,
oracle trunc函数的使用方法
'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的分析函数Over,正在研究中。。。。。。

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