SQL 聚合Null列

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 值。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

SQL 实例