2011-07-29 16 views
7

我有一个名为“numbers”的数字mysql数据库字段,其中有10个条目的数字范围是0-10。当使用AVG时排除带“0”的条目

我想找到的这个平均水平,但不包括所有条目,其中number = 0 但我也想看看有多少项有 - 包括那些其中number = 0

所以我不能只添加一个WHERE数字!= 0,因为这会给COUNT一个错误的结果。

所以我需要类似的东西。

AVG(if(numbers!=0)) AS average 
+0

你需要2个选择。 – Rufinus

回答

18

这个怎么样?

select avg(nullif(field, 0)) from table; 

注意这种方法并如何不会强迫你使用where条款,如果你想用这个作为一个大的查询,你不想在一般排除零个值的一部分。

另外,顺便说一下,avg跳过null值,因此在上面的例子中,我们使用nullif0值到null值。如果使用null值来表示平均值不应考虑的值(例如,如果0是合法值),则只需使用avg(field)

0
SELECT avg(case 
       when numbers = 0 then null 
       else numbers 
      end) as average, 
     count(*) 
FROM your_table 

由于NULL值不用于avg(),所以应该这样做。