2010-08-02 14 views
5

Come faccio a contare valori nulli mentre faccio una query in una tabella incrociata?Conteggio valori Null in MYSQL

Ho una tabella con tre colonne [id, nome, risposta]

ho seguenti record:

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 

ora vorrei ottenere il mio risultato:

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

Sto usando la seguente dichiarazione 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 

Ottenere il mio risultato:

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

Il conte NULL sta ottenendo l'errore. Perché e come posso risolvere questo?

risposta

7

credo che invece di questo:

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

si dovrebbe usare questo:

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

thnx ha funzionato, ma vuole chiedersi perché è diverso da truecount e falsecount. Non dovrebbe essere lo stesso per truecount e falsecount? Quale è corretto per riposare anche gli altri – KoolKabin

+0

null è come undefined. Non definito! = Indefinito. – foret

+0

@KoolKabin: poiché si sta confrontando implicitamente ANS e NULL nel costrutto 'case'. Tuttavia, NULL non equivale a nulla, nemmeno a se stesso: 'NULL! = NULL' (restituisce true). È necessario utilizzare il costrutto speciale "IS NULL": 'NULL IS NULL' (restituisce true). Ingannevole, si. Utile, anche sì. – Piskvor

1

null -> è nullo?

+0

come posso usarlo nella mia soluzione. plz explain – KoolKabin

+0

È la ripetizione della risposta di dcp. Sembra che l'abbiamo scritto quasi contemporaneamente. – foret

1

NULL non si confronta nemmeno con se stesso, è possibile utilizzare "CASE WHEN ANS è NULL" (anche mancano GROUP BY). Oppure prova:

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

scusa per averlo perso ma in realtà lo stavo usando nella mia domanda. lo modificherò anche nella mia domanda .. per suggerimento – KoolKabin