SQL 聚合Null列,你想针对某列做聚合运算,但该列的值为 Null
。你希望保持聚合运算结果的准确性,但又担心聚合函数会忽略 Null
值。例如,你想知道 DEPTNO
等于 30 的员工的平均业务提成,但部分员工实际上没有获得提成(这些人的 COMM
列是 Null
)。由于在聚合运算过程中 Null
会被忽略,因此输出结果的准确性就无法得到保证。总之,你希望聚合运算能以某种方式把 Null
值也包含进去。
SQL 聚合Null列 问题描述
你想针对某列做聚合运算,但该列的值为 Null
。你希望保持聚合运算结果的准确性,但又担心聚合函数会忽略 Null
值。例如,你想知道 DEPTNO
等于 30 的员工的平均业务提成,但部分员工实际上没有获得提成(这些人的 COMM
列是 Null
)。由于在聚合运算过程中 Null
会被忽略,因此输出结果的准确性就无法得到保证。总之,你希望聚合运算能以某种方式把 Null
值也包含进去。
SQL 聚合Null列 解决方案
使用 COALESCE
函数把 Null
转换为 0,这样聚合函数就能处理它们了。
1 select avg(coalesce(comm,0)) as avg_comm
2 from emp
3 where deptno=30
SQL 聚合Null列 扩展知识
使用聚合函数时一定要记住,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
以上结果集显示,在 6 个员工中,只有 4 人能领取业务提成。DEPTNO
等于 30 的员工的提成总额为 2200,因而平均值应该是 2200/6,而不是 2200/4。如果不使用 COALESCE 函数,我们实际上是在回答这样一个问题:“对于 DEPTNO
等于 30、且能领取业务提成的员工而言,其提成平均值是多少?”但实际上我们要回答的问题却是:“对于 DEPTNO
等于 30 的全体员工而言,其提成平均值是多少?”总之,一定要记住的是,一旦涉及聚合运算,就要相应地考虑如何处理 Null
值。