2010-02-25 13 views
8

Necesito contar las filas no vacías (me refiero a una cadena que contiene al menos 1 carácter) agrupadas por una ID particular. P.ej. mis datos podrían tener este aspecto:Contar y agrupar valores no vacíos en MySQL

form_id mapping 
1   'value_1' 
1   '' 
1   'value_2' 
2   '' 
2   NULL 
3   'value_3' 

y quiero contar los valores no vacíos para cada formulario, por lo que desea que los resultados se ven así:

form_id mapping_count 
1   2 
2   0 
3   1 

Si los valores vacíos eran todos NULL, supongo que podría utilizar

SELECT form_id, count(mapping) FROM table GROUP BY form_id 

... pero eso incluiría cadenas de longitud cero en la cuenta, lo que no quiero.

Podría utilizar una cláusula where para solo devolver filas donde exista un valor en la columna de asignación, pero quiero devolver los ID de formulario que no tienen asignaciones, por lo que tampoco sirve.

Supongo que necesito una subconsulta de algún tipo, pero estoy teniendo problemas para armarla.

Respuesta

13
SELECT form_id, COUNT(NULLIF(TRIM(mapping), '')) 
FROM mytable 
GROUP BY 
     form_id 

esto no contará registros que no contiene al menos un carácter no está en blanco (esto incluye cadenas de espacios en blanco, cadenas vacías y NULL s).

Si una cadena de todos los espacios en blanco que no esté vacía es válida, utilice esto:

SELECT form_id, COUNT(NULLIF(mapping, '')) 
FROM mytable 
GROUP BY 
     form_id 
+0

Grande, gracias por eso - yo no había llegado a través de la función NULLIF antes. Exactamente lo que necesitaba. :) – Russ