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