NVL与SUM的关系

      经常有NVL()和SUM()等统计求和的情况,来来回回,有时清楚有时糊涂,今天看到一个文章总结的很好,摘录下来:http://hi.baidu.com/fly_mitac/blog/item/6541e8595c1f7c3b2834f0d4.html

 

 

实例,假如A班全班都未参加数学考试,则下面SQL返回结果为null,而不是期望的0。

select sum(nvl(score,0))

from my_score

where class = 'A'

and subject = 'Math'

 

而修改为下面SQL,才能返回结果为0。

select nvl(sum(socre),0)

from my_score

where class = 'A'

and subject = 'Math'

原因是,sum函数的返回值。在没有满足条件的记录时,是不进行汇总的,sum直接返回null.

sum函数的统计对象部分为null时,返回值是数值。

 

总结:NVL的使用出现率其实算是比较高的,在一些财务报表中,都不会简单的显示一个汇总栏位的,都要在结果上进行复杂的数学运算。所以,保证每个栏位都有值是基本。因为任何数加null,都等于null,所以一旦有栏位为null,则与其相关的其他运算数据,都没了意义。

唉,程序员真的挺辛苦的。为了避免Debug的烦恼,遇到有结果需要进行运算时,随手加上NVL函数吧,加多了没坏处。[上面例子可以写成nvl(sum(nvl(score,0)),0) 双保险,执行速度的变化是人为体会不到的,可以忽略不计。 O(∩_∩)O~ ]

SELECT * FROM ( SELECT ROW_NUMBER() OVER (order by T. code)AS TmpRow, T.*, (case when t.jb = 1 then '国' when t.jb = 2 then '省' when t.jb = 3 then '市' when t.jb = 4 then '县' when t.jb = 5 then '乡镇' when t.jb = 6 then '村' when t.jb = 7 then '村民小组' else '' end ) jb_show, substr(t.code, 0, 2) || '0000000000' province_code, (select name from DIVISIONS where substr(t.code, 0, 2) || '0000000000' =code) province_name, substr(t.code, 0, 4) || '00000000' city_code, (select name from DIVISIONS where substr(t.code, 0, 4) || '00000000' =code) city_name, substr(t.code, 0, 6) || '000000' county_code, (select name from DIVISIONS where substr(t.code, 0, 6) || '000000' =code) county_name, substr(t.code, 0, 9) || '000' town_code, (select name from DIVISIONS where substr(t.code, 0, 9) || '000' =code) town_name, substr(t.code, 0, 12) vallige_code, (select name from DIVISIONS where substr(t.code, 0, 12) =code) vallige_name, (case when T.Is_Check=1 then '已核对' when T.Is_Check=0 then '未核对' else '其他' end) is_check_show, nvl(HDJGRSXJ, 0) HDJGRSXJ, nvl(DJDHDRHS, 0) DJDHDRHS, nvl(DJDHDRRS, 0) DJDHDRRS, nvl(DJDCMXZRS, 0) DJDCMXZRS, RESERVOIR_NAMES, RESERVOIR_CODES, RESERVOIR_CODE_COUNT from DIVISIONS T left outer join ( select QR_VALLIGE_GROUP_CODE, wm_concat(distinct RESERVOIR_NAME) RESERVOIR_NAMES, wm_concat(distinct RESERVOIR_CODE) RESERVOIR_CODES, count(distinct RESERVOIR_CODE) RESERVOIR_CODE_COUNT, nvl(sum(HDJGRSXJ), 0) HDJGRSXJ, nvl(sum(DJDHDRHS), 0) DJDHDRHS, nvl(sum(DJDHDRRS), 0) DJDHDRRS, nvl(sum(DJDCMXZRS), 0) DJDCMXZRS from basedata_register_villager_gro group by QR_VALLIGE_GROUP_CODE ) brvg on brvg.QR_VALLIGE_GROUP_CODE=t.code WHERE code like'45%' and jb<5 and NAME like '%' || :keyWord || '%' ) TT WHERE TT.TmpRow between 1 and 30
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值