Mysql 计算某些列的平均值,不计算空值
我有一张表,上面有一些读数,如下所示:Mysql 计算某些列的平均值,不计算空值,mysql,sql,database,Mysql,Sql,Database,我有一张表,上面有一些读数,如下所示: id foo bar baz qux 1 2 4 NULL 3 2 6 11 0 2 我想计算一些列的平均值,不包括计数中的空值。类似于以下伪代码: select (foo+bar+baz)/countNonNulls(foo,bar,baz) AS result FROM readings WHERE id=1; 也就是说,我的预期结果是(2+4)/2=3 有
id foo bar baz qux
1 2 4 NULL 3
2 6 11 0 2
我想计算一些列的平均值,不包括计数中的空值。类似于以下伪代码:
select (foo+bar+baz)/countNonNulls(foo,bar,baz) AS result
FROM readings WHERE id=1;
也就是说,我的预期结果是(2+4)/2=3
有没有一种方法可以在单个SQL查询中实现这一点?尝试where子句:在MySQL中,where[nameColumn]不为null可以使用:
select (coalesce(foo, 0) + coalesce(bar, 0) + coalesce(baz, 0) /
((foo is not null) + (bar is not null) + (baz is not null))
) as average
请注意,这假设至少有一个值不为null,以防止被0除
要处理一般情况,您可以使用以下用例:
select (case when coalesce(foo, bar, bz) is not null
then (coalesce(foo, 0) + coalesce(bar, 0) + coalesce(baz, 0) /
((foo is not null) + (bar is not null) + (baz is not null))
)
end) as average
这种问题有时表明设计不佳。为什么要在原始值周围添加聚结?@MMacdonald。如果将
NULL
值添加到另一个数字,则将得到NULL
值NULL
不被视为零(尽管在聚合函数中,如sum()
NUL
值被忽略,因此与0的处理方式相同)。