一尘不染

MySQL:使用空值进行平均

sql

有没有一种简单的方法可以排除null来影响平均值?它们似乎算作0,这不是我想要的。我只是不想考虑它们的平均值,但是这里有个问题,我不能从结果集中删除它们,因为该记录包含我确实需要的数据。

更新:

例子:

select avg(col1+col2), count(col3) from table1
where
group by SomeArbitraryCol
having avg(col1+col2) < 500 and count(col3) > 3
order by avgcol1+col2) asc;

这对我来说是有用的,但是平均值不准确,因为它们将空值计数为0,这确实使整个平均值下降了。


阅读 190

收藏
2021-05-16

共1个答案

一尘不染

SQL中的聚合函数(SUM,AVG,COUNT等)始终自动排除NULL。

所以SUM(col)/ COUNT(col)= AVG(col)-这很棒而且很一致。

COUNT(*)的特例是对每一行进行计数。

如果用NULL组成表达式:A + B其中A或B为NULL,则A + B将为NULL而不管其他列是否为NULL。

当存在NULL时,通常是AVG(A + B)<> AVG(A)+
AVG(B),并且它们也可能具有不同的分母。您必须包装以下列:AVG(COALESCE(A,0)+
COALESCE(B,0))即可解决此问题,但也可能不包括COALESCE(A,0)+ COALESCE(B,0)的情况。

根据您的代码,我建议:

select avg(coalesce(col1, 0) + coalesce(col2, 0)), count(col3) from table1
where coalesce(col1, col2) is not null -- double nulls are eliminated
group by SomeArbitraryCol
having avg(coalesce(col1, 0) + coalesce(col2, 0)) < 500 and count(col3) > 3
order by avg(coalesce(col1, 0) + coalesce(col2, 0)) asc;
2021-05-16