2013-02-09 4 views
67

Ich habe gerade ein wenig mit etwas SQL stecken. Ich denke nicht, dass ich die Frage brilliant formulieren kann - also lass mich es dir zeigen.Wie fügt man "Null"/"0" Ergebnisse in COUNT Aggregat?

Ich habe zwei Tabellen, eine Person genannt, eine namens Termin. Ich versuche, die Anzahl der Termine zurückzugeben, die eine Person hat (einschließlich wenn sie Null haben). Termin enthält die person_id und es gibt eine person_id pro Termin. So ist COUNT(person_id) ein vernünftiger Ansatz.

Die Abfrage:

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

korrekt zurückgeben, die Anzahl der Termine eine person_id hat. Eine Person, die 0 Termine hat, wird jedoch nicht zurückgegeben (offensichtlich, da sie nicht in dieser Tabelle sind).

die Anweisung Tweaking von der Person Tabelle gibt mir wie etwas zu nehmen person_id:

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; 

jedoch Dies wird nur noch eine person_id zurückgeben, die einen Termin hat und nicht, was ich will, das ist eine Rückkehr mit Personen wer hat 0 Termine!

Irgendwelche Vorschläge bitte?

Antwort

58

Sie wollen eine äußere hierfür kommen (und Sie müssen Person als „Fahren“ Tabelle verwenden)

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; 

Der Grund, warum diese funktioniert, ist, dass der äußere (linke) Join NULL für diejenigen Personen zurückgibt, die keinen Termin haben. Die Aggregatfunktion count() zählt nicht NULL Werte und damit erhalten Sie eine Null.

Wenn Sie mehr erfahren möchten über Outer-Joins, hier ist ein nettes Tutorial: http://sqlzoo.net/wiki/Using_Null

17

Sie müssen LEFT JOIN anstelle von 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

Die GROUP BY scheint ein Tippfehler in der ursprünglichen Frage, da die Tabelle nicht in der Abfrage enthalten ist. –

+0

@JoachimIsaksson Mein Fehler. Na sicher :) –

4

, wenn Sie die äußere (mit der Zählung) verbinden, und dann dieses Ergebnis als eine Untertabelle verwenden, können Sie bekommen 0 wie erwartet (dank der Funktion 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

JOIN 0 Zählung im Ergebnis mit GROUP BY zu erhalten.

einfach 'Join' macht Inner Join in MS SQL also, Gehen Sie für Links oder Rechts Join.

Wenn die Tabelle, die den Primärschlüssel enthält, zuerst in QUERY erwähnt wird, verwenden Sie LEFT Join, andernfalls RIGHT Join.

Beispiel:

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

.

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

Nehmen Sie Gruppe von aus der Tabelle, die Primärschlüssel hat und zählen aus der anderen Tabelle, die tatsächliche Einträge/Details hat.

Verwandte Themen