关于oracle中的decode的使用

来源:互联网 发布:印刷自助报价系统源码 编辑:程序博客网 时间:2024/06/09 15:47

在项目中发现了一个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