MySQL:使用空值求平均值

时间:2010-03-19 21:32:53

标签: sql mysql

有没有一种简单的方法可以排除空值影响平均值?它们似乎算作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,这实际上是在抛弃整个平均值。

6 个答案:

答案 0 :(得分:15)

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

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

COUNT(*)的特殊情况计算每一行。

如果组成一个带NULL的表达式:A + B,其中A或B为NULL,那么无论另一列是否为NULL,A + B都将为NULL。

当存在NULL时,通常,AVG(A + B)&lt;&gt; AVG(A)+ AVG(B),他们也可能有不同的分母。您必须包装列:AVG(COALESCE(A,0)+ COALESCE(B,0))来解决这个问题,但也可能排除COALESCE(A,0)+ COALESCE(B,0)的情况。 / p>

根据您的代码,我建议:

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;

答案 1 :(得分:6)

AVG(number) 

这是我能想到的最佳方式。这应该自动不包括空值。 Here有点阅读。

答案 2 :(得分:3)

SELECT SUM(field) / COUNT(field)
FROM table
WHERE othercondition AND (field IS NOT NULL)

Link

答案 3 :(得分:1)

基于原始问题的答案:

SELECT AVG(t1.NumCol + t1.NumCol2), COUNT(table.NumCol) 
FROM 
(
SELECT NumCol, NumCol2 
FROM table 
WHERE (cond) AND (NumCol IS NOT NULL) AND (NumCol2 IS NOT NULL)
) t1,
table
WHERE (cond)

我认为在新的限制下,这仍然在理论上有效,但不是最有效的方式

答案 4 :(得分:1)

你很有可能从其他人在这里所说的内容中得到正确答案,但万一你没有:

你的表中的哪些值可能为NULL?如果有的话,你想要发生什么?

如果col1为NULL,或col2为NULL,或者两者碰巧为NULL等,则永远不会指定要查看的结果。

答案 5 :(得分:0)

我最近使用过这个技巧:

AVG(
    CASE
        WHEN
            valToBeAveraged IS NULL
        THEN
            0
        ELSE
            valToBeAveraged
    END
)

我相信警告就是这样。但这让我安心,因为我确切知道它是如何运作的。

快乐编码