据我所知,AVG() 函数忽略了 NULL 值。
所以 AVG(4,4,4,4,4,NULL) --> 4
就我而言,我不希望这种情况发生。
我需要这样的解决方案:AVG(4,4,4,4,4,NULL) --> 3,33
无需直接替换表本身中的 NULL 值。
有什么办法可以做到这一点吗?
> 使用 coalesce()
返回空列的实际值零:
select avg(coalesce(some_column, 0))
from ...
您对 AVG 的行为是正确的 - 使用 COALESCE 将聚合中的 NULL 转换为 0。
请参阅"为什么 SUM(null) 在 Oracle 中不是 0?
如果您正在寻找此行为的基本原理,则可以在 ANSI SQL 标准中找到它,该标准规定聚合运算符忽略 NULL 值。
然后,相关代码很简单:
Avg(Coalesce(col,0))
您也可以使用 coalesce
或nvl
。由于上面已经给出了coalesce
示例,因此下面是一个nvl
Avg(Nvl(Column_Name),0)
Coalesce、Nvl、Nvl2 函数在处理空值的情况下非常方便。您应该查找有关这些内容的一些示例和文档。
NVL,NVL2或COALESCE来解决此问题。
喜欢这个从 dual 中选择 avg(4,4,4,4, nvl(null, 0 ));
另一种可能性是使用聚合函数 SUM 和 COUNT 计算平均值
SELECT SUM(column_with_value) / COUNT(primary_column) FROM ...