2011-07-29 41 views
7

Tengo un campo de base de datos número mysql llamado "números" en el que hay 10 entradas con números que van del 0-10.Excluir entradas con "0" al utilizar AVG

me gustaría encontrar el medio de esto, pero con exclusión de todas las entradas en número = 0. Pero también me gustaría contar cuántas entradas existen - incluyendo aquellos en los que el número = 0.

¡Así que no puedo agregar un WHERE numbers! = 0, ya que eso daría un resultado incorrecto en mi COUNT.

Así que necesito algo así como.

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

necesitarás 2 selecciones para ello. – Rufinus

Respuesta

18

¿Qué le parece esto?

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

Observe cómo este método no le obliga a utilizar una cláusula where, en caso de que quiera utilizar esto como parte de una consulta más amplio en el que no desea excluir valores cero en general.

También, por cierto, avg salta null valores, por lo que en el ejemplo anterior se utilizó nullif para convertir 0 valores en null valores. Si usa los valores null para representar valores que no deberían tenerse en cuenta para el promedio (por ejemplo, si 0 es un valor legítimo), simplemente use avg(field).

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

Como los valores NULL no se utilizan para avg() esto debería hacerlo.