在项目中发现了一个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
谢谢大家!
转载请注明出处!