SQL中null、空查询及0分析

/*
对于null,
即是可以查询到记录的,null不能做常见运算,如相加、相乘、判断是否相等。
在计算时,要isnull(字段名,0)或isnull(字段名,'其他')再做计算。 */


-- 错误的:
-- 没有统计进bd_code为null的

select
temp00.name0,
temp01.num0
from
temp00
left join
temp01
on
temp00.bd_code=temp01.bd_code


-- 正确定:
-- 将bd_code为为null的归为一类
select
temp00.name0,
temp01.num0
from
temp00
left join
temp01
on
isnull(temp00.bd_code,'')=isnull(temp01.bd_code,'')







/*
对于0
常见错误为,0作为分母。 */



-- 错误的:
with
temp00 as(
select
sum(实收) num0
from
实收表),
temp01 as(
select
sum(应收) num1
from
应收表)

select
temp00.实收/temp01.应收 actu_num
from
temp00
left join
temp01
on 1=1



-- 正确的:
with
temp00 as(
select
sum(实收) num0
from
实收表),
temp01 as(
select
sum(应收) num1
from
应收表)

select
case
when temp01.应收=0
then 0
else
temp00.实收/temp01.应收
end actu_num
from
temp00
left join
temp01
on 1=1




/*
对于空查询,
也就是没有查询记录,即使你用isnull转换也没用,他没有查询记录。
没有查询记录再进行计算,当然是null的。 */


-- 错误的
with
temp00 as(
select
sum(基本工资) num0
from
工资表),
temp01 as(
select
sum(加班工资) num1
from
加班表)

select
temp00.num0+temp01.num1  actu_num
from
temp00
left join
temp01
on 1=1


-- 正确的
with
temp00 as(
select
sum(基本工资) num0
from
工资表
union all
select 0 num0),
temp01 as(
select
sum(加班工资) num1
from
加班表
union  all
select 0 num1)

select
sum(temp00.num0)+sum(temp01.num1)  actu_num
from
temp00
left join
temp01
on 1=1

猜你喜欢

转载自www.cnblogs.com/linyuansun/p/12400446.html
今日推荐