问题:对某列进行聚集运算,但该列的值可为空,由于函数会忽略NULL值,能否保持聚集运算的准确性令人担忧。例如,想要求DEPTNO 30中职员的平均佣金,但有些职员不挣佣金(这些职员的COMM值为NULL)。由于聚集运算会忽略NULL,因此输出结果的准确性没有保障。在进行聚集运算时有时可能需要以某种方式将NULL值包括进来。
解决方案
使用COALESCE函数把NULL转换为0,这样在进行聚集时可以把它们包括进来:
1 select avg(coalesce(comm,0)) as avg_comm
2 from emp
3 where deptno=30
讨论
请务必记住,在使用聚集函数时会忽略NULL。不使用COALESCE函数时该解决方案的输出如下:
select avg(comm)
from emp
where deptno=30
AVG(COMM)
---------
550
该查询表明,DEPTNO 30的平均佣金是550,快速检查这些行如下:
select ename, comm
from emp
where deptno=30
order by comm desc
ENAME COMM
---------- ---------
BLAKE
JAMES
MARTIN 1400
WARD 500
ALLEN 300
TURNER 0
这表明六个职员中只有四个职员挣得佣金。DEPTNO 30中所有佣金的总和是2200,其平均值应该是2200/6,而不是2200/4。如果不用COALESCE函数,回答的是问题“DEPTNO 30中挣得佣金的职员的平均佣金是多少?”,而不是“DEPTNO 30中所有职员的平均佣金是多少?”。使用聚集时记住要相应处理NULL值。