阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle多条件的统计查询(case when)

113次阅读
没有评论

共计 1254 个字符,预计需要花费 4 分钟才能阅读完成。

要做一个统计查询的功能,因为涉及多张表,多种条件的统计分析。一开始便想到了 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 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-02/140581.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计1254字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中