SQL:具有 NULL 值的 AVG

Posted

技术标签:

【中文标题】SQL:具有 NULL 值的 AVG【英文标题】:SQL: AVG with NULL Values 【发布时间】:2014-03-06 09:39:09 【问题描述】:

据我了解,AVG() 函数会忽略 NULL 值。

所以 AVG(4,4,4,4,4,NULL) --> 4

就我而言,我不希望这种情况发生。

我需要这样的解决方案:AVG(4,4,4,4,4,NULL) --> 3,33

无需直接替换表本身中的 NULL 值。

有什么办法吗?

【问题讨论】:

如果实际数据应该是 0s,则不应使用 NULLs。 NULLs 和 0s 是“等价的”是在数据库中没有位置的 C 主义。 我知道,但恐怕在这种情况下我对此没有影响 【参考方案1】:

使用coalesce() 为空列返回零的实际值:

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

【讨论】:

这种 COALESCE 语法有很多变体。我最喜欢 ISNULL() 函数(在语言上更有意义)。更多信息:w3schools.com/sql/sql_isnull.asp【参考方案2】:

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

请参阅“为什么 SUM(null) 在 Oracle 中不是 0?”中的 this answer?

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

那么相关的代码就是:

Avg(Coalesce(col,0))

【讨论】:

【参考方案3】:

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

Avg(Nvl(Column_Name),0)

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

【讨论】:

【参考方案4】:

NVL、NVL2 或 COALESCE 可用于解决此问题。

像这样 select avg(4,4,4,4, nvl(null, 0 )) from dual;

【讨论】:

【参考方案5】:

另一种可能性是使用聚合函数 SUM 和 COUNT 计算平均值

SELECT SUM(column_with_value) / COUNT(primary_column) FROM ...

【讨论】:

以上是关于SQL:具有 NULL 值的 AVG的主要内容,如果未能解决你的问题,请参考以下文章

具有“NULL”值的 Oracle SQL Analytics 函数 FirstValue

Oracle SQL - 具有 NULL 值的 max()

一个 sql (oracle) 查询,用于获取每列具有两个不同(null 和非 null)值的唯一信息

SQL从具有空值的行数据中选择MIN值

sql WHERE NOT选择不等于值的行。它忽略NULL值,因此在示例中,具有不是“USA”的国家/地区的行

连接具有空值的汇总数据 - SQL Server