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 值。
有什么办法吗?
【问题讨论】:
如果实际数据应该是0
s,则不应使用 NULL
s。 NULL
s 和 0
s 是“等价的”是在数据库中没有位置的 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】:您也可以使用coalesce
或nvl
。
由于上面已经给出了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
一个 sql (oracle) 查询,用于获取每列具有两个不同(null 和非 null)值的唯一信息