2012-07-07 13 views
14

Ho una tabella che appare un po 'come questo:SQL - contando le righe con valore specifico

id value 
1 0 
1 1 
1 2 
1 0 
1 1 
2 2 
2 1 
2 1 
2 0 
3 0 
3 2 
3 0 

Ora, per ogni id, voglio contare il numero di occorrenze di 0 e 1 e il numero di occorrenze per che ID (il valore può essere qualsiasi numero intero), in modo che il risultato finale dovrebbe essere simile a questo:

id n0 n1 total 
1 2 2 5 
2 1 2 4 
3 2 0 3 

sono riuscito ad ottenere la prima e l'ultima fila con questa affermazione:

SELECT id, COUNT(*) FROM mytable GROUP BY id; 

Ma io sono un po 'perso da qui. Qualche suggerimento su come ottenere questo senza un'enorme affermazione?

risposta

26

Con MySQL, è possibile utilizzare SUM(condition):

SELECT id, SUM(value=0) AS n0, SUM(value=1) AS n1, COUNT(*) AS total 
FROM  mytable 
GROUP BY id 

vedi sul sqlfiddle.

+1

Dolce, non sapevo nemmeno che esistesse un 'SUM (condizione)'! – ryyst

+2

@ryyst: Beh, è ​​un trucco che sfrutta il fatto che MySQL valuta i risultati booleani delle espressioni condizionali a 0 se falso e 1 se vero; quindi prendere il 'SUM' su ogni gruppo fornisce un conteggio di quei record in cui la condizione è vera. – eggyal

+7

Puoi anche essere più espressivo e usare 'COUNT (CASE WHEN value = 0 THEN 1 END) AS n0, ..., ...', che funzionerà in tutti gli altri principali DBMS dato che MySQL è l'unico a rendere implicito conversioni booleane. Vedi la mia [domanda qui] (http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count) per ulteriori informazioni. –

0

Come @Zane ha commentato sopra, il metodo tipico è utilizzare le espressioni CASE per eseguire il pivot.

SQL Server dispone ora di un operatore PIVOT che è possibile visualizzare. DECODE() e IIF() erano approcci più vecchi su Oracle e Access che potresti ancora trovare in giro.

Problemi correlati