关于oracle中的decode的使用

在项目中发现了一个oracle decode的用法。

简化后如下:

select sum(decode(t.del_flg,2,1,0)) from tm_employee_infor t;

 

这是可以统计表中del_flg状态值为2的数量,decode函数解释参见:点击打开链接

 

这个sql看着有点奇怪,我们先执行下内层函数decode:

select decode(t.del_flg,2,1,0) from tm_employee_infor t;


执行结果(部分)如下:

从执行结果可以看出,这一列中根据decode函数用法:  if  t.del_flg is 2 

                                                                                                           then 1

                                                                                                    else 0;

然后外层函数sum()会对该列中的数据进行叠加,就可以实现根据不同条件值来统计总数。

通常情况下,使用该方法可以只用一个很短的sql就可以代替使用where,union子句的方法。

另外贴上项目中使用的稍微复杂的统计总数的sql:

select rownum,
       id company_id,
       organization_name,
       dimention_desc,
       totalnum,
       status_1,
       status_2,
       status_3,
       status_4,
       status_5,
       status_6,
       status_8,
       status_9
  from (select t.organization_name,
               t.dimention_desc,
               t.id,
               sum(1) totalnum,
               sum(decode(t.status, 1, 1, 0)) status_1,
               sum(case
                     when t.status = 1 and t.est_comp_date < sysdate then
                      1
                     else
                      0
                   end) status_6,
               sum(decode(t.status, 2, 1, 0)) status_2,
               sum(decode(t.status, 3, 1, 0)) status_3,
               sum(decode(t.status, 4, 1, 0)) status_4,
               sum(decode(t.status, 5, 1, 0)) status_5,
               sum(decode(t.status, 8, 1, 0)) status_8,
               sum(decode(t.status, 9, 1, 0)) status_9
          from (select totd.data_tab_description,
                       td.dimention_desc,
                       toi.id,
                       toi.organization_name,
                       todt.batchname,
                       todt.user_name,
                       todt.status,
                       todt.est_comp_date,
                       decode(todt.status,
                              1,
                              '任务待填写',
                              2,
                              '任务待审核',
                              '4',
                              '任务已通过',
                              5,
                              '退回',
                              9,
                              '草稿',
                              3,
                              '数据校验完成任务待复审状态')
                  from tm_ori_data_task   todt,
                       ts_ori_tab_opr_def totod,
                       ts_ori_tab_def     totd,
                       tm_company         tc,
                       tm_org_info        toi,
                       ts_dimention       td
                 where todt.ori_tab_opr_def_id = totod.id
                   and totod.ts_ori_tab_def_id = totd.id
                   and todt.company_id = tc.id
                   and tc.tm_org_info_id = toi.id
                   and tc.dimention_id = td.id
                   and (todt.del_flg = 1 or todt.del_flg = 0 or
                       todt.del_flg is null)
                   and todt.task_date >= to_date('2014-05-01', 'yyyy-MM-dd')
                   and todt.task_date <= to_date('2015-03-03', 'yyyy-MM-dd')
                   and (todt.company_id = 10 or toi.parent_id = 10)
                 order by totd.id) t
         group by t.organization_name, t.id, t.dimention_desc
         order by t.organization_name asc)


交流可以致邮:wfeiyangvip@163.com

谢谢大家!

转载请注明出处!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值