2013-02-09 19 views
67

Mi sono appena un po 'bloccato con un po' di SQL. Non penso di poter esprimere brillantemente la domanda - quindi lascia che te lo mostri.Come includere "zero"/"0" in COUNT aggregato?

Ho due tavoli, uno chiamato persona, uno chiamato appuntamento. Sto cercando di restituire il numero di appuntamenti di una persona (incluso se hanno zero). Appuntamento contiene il person_id e c'è un person_id per appuntamento. Quindi COUNT(person_id) è un approccio ragionevole.

La query:

SELECT person_id, COUNT(person_id) AS "number_of_appointments" 
FROM appointment 
GROUP BY person_id; 

tornerà correttamente, il numero di appuntamenti un person_id ha. Tuttavia, una persona che ha 0 appuntamenti non viene restituita (ovviamente poiché non si trovano in quella tabella).

Ottimizzare la dichiarazione di prendere person_id dal tavolo persona mi dà qualcosa di simile:

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM appointment 
JOIN person ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

Questo, tuttavia, sarà ancora restituire solo un person_id che ha un appuntamento e non quello che voglio, che è un ritorno con le persone chi ha 0 appuntamenti!

Qualche suggerimento, per favore?

risposta

58

Volete un join esterno per questa (ed è necessario utilizzare persona come il tavolo "guida")

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
    LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 

Il motivo per cui questo sta funzionando, è che l'unione esterna (a sinistra) restituirà NULL per quelle persone che non hanno un appuntamento. La funzione di aggregazione count() non conterrà i valori NULL e quindi otterrai uno zero.

Se volete saperne di più su outer join, ecco un bel tutorial: http://sqlzoo.net/wiki/Using_Null

17

È necessario utilizzare LEFT JOIN invece di INNER JOIN

SELECT person.person_id, COUNT(appointment.person_id) AS "number_of_appointments" 
FROM person 
LEFT JOIN appointment ON person.person_id = appointment.person_id 
GROUP BY person.person_id; 
+0

Il GRUPPO BY sembra un errore nella domanda originale poiché la tabella non è inclusa nella query. –

+0

@JoachimIsaksson Il mio errore. Ovviamente :) –

4

se l'outer join (con il conte), e quindi utilizzare questo risultato come un sub-tabella, è possibile ottenere 0 come previsto (grazie alla funzione NVL)

Ex:

select P.person_id, nvl(A.nb_apptmts, 0) from 
(SELECT person.person_id 
FROM person) P 
LEFT JOIN 
(select person_id, count(*) as nb_apptmts 
from appointment 
group by person_id) A 
ON P.person_id = A.person_id 
1

uSO unirsi per ottenere 0 conteggio il risultato usando GROUP BY.

semplicemente 'join' fa Inner join in MS SQL quindi, Vai per unire a sinistra oa destra.

Se la tabella che contiene la chiave primaria è menzionata per prima nel QUERY, utilizzare SINISTRA un altro membro DESTRO.

EG:

select WARDNO,count(WARDCODE) from MAIPADH 
right join MSWARDH on MSWARDH.WARDNO= MAIPADH.WARDCODE 
group by WARDNO 

.

Prendere il gruppo dalla tabella che ha la chiave primaria e il conteggio dall'altra tabella con voci/dettagli effettivi.