SQL:带有NULL值的AVG函数

21
据我所了解,AVG()函数忽略NULL值。 因此AVG(4,4,4,4,4,NULL) --> 4。 在我的情况下,我不想让它发生。 我需要这样的解决方案:AVG(4,4,4,4,4,NULL) --> 3.33, 而不直接替换表中的NULL值。 有什么办法可以做到这一点吗?

1
如果实际数据应该是0,则不应使用NULL。在数据库中,“NULL”和“0”等价是C语言的一种用法,不适用于数据库。 - Damien_The_Unbeliever
1
我知道,但恐怕在这种情况下我对此没有影响。 - user3364656
5个回答

28

使用coalesce()函数来将null列返回为零的实际值:

select avg(coalesce(some_column, 0))
from ...

1
这个COALESCE语法有很多变体。我最喜欢ISNULL()函数(在语言上更有意义)。更多信息:https://www.w3schools.com/sql/sql_isnull.asp - Dave Skender

4
你对AVG的行为是正确的 - 使用COALESCE将NULL转换为聚合中的0。

请参阅"Why SUM(null) is not 0 in Oracle?"中的答案。

如果你正在寻找这种行为的理由,那么它可以在ANSI SQL标准中找到,这些标准规定聚合运算符忽略NULL值。

相关代码如下:

Avg(Coalesce(col,0))

0
NVL、NVL2或COALESCE可以用来解决这个问题。
像这样 从双重选择中选择平均值(4,4,4,4, nvl(null, 0 ))。

0
另一种可能性是使用聚合函数SUM和COUNT来计算平均值。
SELECT SUM(column_with_value) / COUNT(primary_column) FROM ...

0

您也可以使用coalescenvl函数。 由于上面已经给出了coalesce的示例,这里是一个nvl的示例。

Avg(Nvl(Column_Name),0)

在处理空值的情况下,Coalesce、Nvl、Nvl2函数非常方便。你应该查阅一些关于这些函数的示例和文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接