2010-08-02 26 views
5

¿Cómo puedo contar los valores nulos al hacer una consulta con tabulación cruzada?Recuento de valores nulos en MYSQL

tengo una tabla con tres columnas [ID, nombre, respuesta]

tengo siguientes registros:

ID NAME ANS 
1 ABC 1 
1 ABC 0 
1 ABC NULL 
2 XYZ 1 
2 XYZ NULL 
2 XYZ NULL 
2 XYZ 1 
2 XYZ 0 
1 ABC 0 

Ahora me gustaría obtener mi resultado:

ID Name NULLCOUNT  TRUE COUNT FALSE COUNT 
1 ABC 1    1   2 
2 XYZ 2    2   1 

Estoy utilizando la siguiente instrucción SQL:

select ID, NAME, 
    sum(case ANS when null then 1 else 0 end) as NULLCOUNT, 
    sum(case ANS when 1 then 1 else 0 end) as TRUECOUNT, 
    sum(case ANS when 0 then 1 else 0 end) as FALSECOUNT 
from 
    TBL1 
Group By ID, Name 

Conseguir mi resultado:

ID Name NULLCOUNT  TRUE COUNT FALSE COUNT 
1 ABC 0    1   2 
2 XYZ 0    2   1 

El Conde NULL es cada error. ¿Por qué y cómo puedo solucionar esto?

Respuesta

7

creo que en lugar de esto:

sum(case ANS when null then 1 else 0 end) as NULLCOUNT 

para utilizar este:

sum(case when ANS is null then 1 else 0 end) as NULLCOUNT 
+0

thnx funcionó, pero quiere preguntar por qué es diferente de truecount y falsecount. ¿No debería ser igual para truecount y falsecount? Cuál es el correcto para el resto otros también – KoolKabin

+0

null es como undefined. Indefinido! = Indefinido. – foret

+0

@KoolKabin: porque está implícitamente comparando ANS y NULL en el constructo 'case '. Sin embargo, NULL no es igual a nada, ni siquiera a sí mismo: 'NULL! = NULL' (se evalúa como verdadero). Necesitas usar el constructo especial "IS NULL": 'NULL IS NULL' (se evalúa como verdadero). Tricky, sí. Útil, también sí. – Piskvor

1

nula -> es nulo?

+0

cómo puedo usarlo en mi solución. por favor explique – KoolKabin

+0

Se repite la respuesta de dcp. Parece que lo escribimos casi simultáneamente. – foret

1

NULL ni siquiera se compara consigo mismo, puede usar "CASE WHEN ANS is NULL" (también le falta GROUP BY). O intente:

select ID, NAME, 
    sum(if(ans IS NULL, 1, 0)) as NULLCOUNT, 
    sum(case ANS when 1 then 1 else 0 end) as TRUECOUNT, 
    sum(case ANS when 0 then 1 else 0 end) as FALSECOUNT 
from 
    TBL1 
group by ID,NAME 
+0

perdón por perderlo en cuestión, pero de hecho lo estaba usando en mi consulta. Voy a editarlo en mi pregunta también ... gracias por la sugerencia – KoolKabin