冷面阎罗

低调做人&&高调做事
随笔 - 208, 文章 - 3, 评论 - 593, 引用 - 0
数据加载中……

ORACLE数据统计0的处理

          大概是前一周去见客户,他要弄了年终统计报表,从系统中所有台帐的基础数据去统计总算、容量等数据。
         拿到统计模板一看,傻眼了需要统计近百项,而且每一项都需要单独使用SQL去查询。
         起初  为了方便查询数据,中间视图套用视图,结果发现我嵌套了3层视图,效率实在不敢恭维。
         后来 为了提高效率,就把中间的视图去掉,改为从表查询数据,结果每个项需要查询3~4表,效率比第一次提升不少。其实查询这种统计数据,千万不能视图套用视图,那效率就没的说了。

        程序实现,发现使用count(*)统计总数的时候,如没有则显示0;使用sum()统计,则没有不显示,这样我前台页面上有的没有数据显示0,有的没有数据不显示,不统一也不美观。
   
       改造1,在查询数据的java端操作,不是我不想在 我的视图中修改,我先后试验过decode、nvl、case甚至使用if then else 语句,都没有把这个讨厌的0去掉,没有部分只好在java端进行for循环了,这样效率也不怎么样,白白多了2层循环,鉴于视图写的比较合理,这样的速度客户居然能接受。

      晚上睡觉就想,怎么才能把0去掉了,基本上把oracle的函数都想一遍了,甚至想自己写的函数实现,后来想到replace函数,结果使用成功了。

     但是发现使用replace的效率好像没有使用改造1的方案快?

    不知各位还有没有别的方法处理0这个问题,欢迎大家讨论一下。

posted on 2008-07-11 16:12 冷面阎罗 阅读(5400) 评论(8)  编辑  收藏 所属分类: 数据库

评论

# re: ORACLE数据统计0的处理  回复  更多评论   

呵呵不是方法的方法,但能解决问题。vista的源码中说不定也有这样曲线救国的代码呢
:)
2008-07-11 17:09 | hnwyf

# 大梅沙云顶天海会所  回复  更多评论   

大梅沙云顶天海会所
2008-07-11 17:47 | 大梅沙云顶天海会所

# re: ORACLE数据统计0的处理  回复  更多评论   

--有两个办法,可以不用去改java程序,而在SQL里进行统一
--一个是在使用sum的查询外面再嵌套一层:
select sum(1) as a from tbl_test t where t.id<100
-->
select (case when x.a is null then 0 end) as a from --在外层对NULL进行转换
(select sum(1) as a from tbl_test t where t.id<100) x

--第二种办法是直接在sum的参数里进行处理:
select sum(1) as a from tbl_test t where t.id<100
-->
select sum(case when t.id<100 then 1 else 0 end) as a from tbl_test t
--把统计条件放到sum的参数里,可以对NULL进行转换
2008-07-13 00:08 | masuz

# re: ORACLE数据统计0的处理  回复  更多评论   

@masuz
sum函数如果求和的列没有数据,即为null的时候,sum后的结果为null,
但是count函数,统计的函数是从0开始的。
2008-07-13 08:11 | 冷面阎罗

# re: ORACLE数据统计0的处理  回复  更多评论   

如果sum的列为NULL,那就判断一下再sum,应该可以
select sum(case when t.num is null then 0 else t.num end) as a from tbl_test t
2008-07-13 14:36 | masuz

# re: ORACLE数据统计0的处理[未登录]  回复  更多评论   

使用nvl
2008-07-14 12:27 | Jarod

# re: ORACLE数据统计0的处理[未登录]  回复  更多评论   

在项目实施过程中也遇到一个类似的问题。
要统计数据,但是表中间一条数据都没有,结果用SUM出来什么都没有,客户希望出来的是0.
结果就先用count(*)判断是不是有记录,没有直接返回0,有再进行SUM操作。SUM操作的时候将NULL的变成0,这样进行统计,结果始出来的。不过用count函数,还必须有个GROUP BY的操作,变态啊……
2008-07-14 12:36 | James

# re: ORACLE数据统计0的处理[未登录]  回复  更多评论   

select nvl(sum(x),0) from xxx

这样就行了....
2008-07-14 14:25 | yy

只有注册用户登录后才能发表评论。


网站导航: