Frage Wie fügt man "Null" / "0" Ergebnisse in COUNT Aggregat ein?


Ich habe mich gerade ein wenig mit SQL beschäftigt. Ich denke nicht, dass ich die Frage brilliant formulieren kann - also lass mich es dir zeigen.

Ich habe zwei Tische, einen angerufenen Person, einen angerufenen 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 da ist ein person_id nach Vereinbarung. Damit COUNT(person_id) ist ein vernünftiger Ansatz.

Die Abfrage:

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

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

Das Anpassen der Anweisung, person_id von der Personentabelle zu übernehmen, gibt mir etwas wie:

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;

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

Irgendwelche Vorschläge bitte?


76
2018-02-09 23:59


Ursprung


Antworten:


Sie möchten einen äußeren Join dafür (und Sie müssen Person als die "treibende" 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 das funktioniert, ist, dass der äußere (linke) Join zurückkehrt NULL für diejenigen Personen, die keinen Termin haben. Die Aggregatfunktion count() zählt nicht NULL Werte und damit erhalten Sie eine Null.

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


67
2018-02-10 00:04



Sie müssen verwenden LEFT JOIN Anstatt 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;

17
2018-02-10 00:03



Wenn Sie den äußeren Join (mit der Anzahl) ausführen und dieses Ergebnis dann als Untertabelle verwenden, erhalten Sie 0 wie erwartet (dank der nvl-Funktion)

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

4
2018-01-20 13:30



USE join, um mit GROUP BY eine Anzahl von 0 im Ergebnis 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.

Z.B:

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 die Gruppe nach aus der Tabelle, die den Primärschlüssel hat, und zählen Sie aus der anderen Tabelle, die tatsächliche Einträge / Details hat.


2
2017-11-09 10:55



Um bei Ihrer ursprünglichen Abfrage noch weniger zu ändern, können Sie Ihre Verknüpfung in eine RIGHT Beitreten

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

Dies baut nur auf der ausgewählten Antwort auf, aber wie der äußere Join in der RIGHT Richtung, nur ein Wort muss hinzugefügt werden und weniger Änderungen. - Denken Sie daran, dass es da ist und manchmal Abfragen lesbarer machen und weniger Wiederaufbau benötigen.


0
2018-06-28 12:21