MYSQL: Mehrere SELECT COUNT-Abragen mit GROUP BY

squeezer

Grünschnabel
Hallo Community,

wieder mal eine Frage von mir als SQL-Dummy ;)

Ich stehe vor folgender Herausforderung:

Es soll eine Ausgabe in Form einer Tabelle erfolgen, in der nach PLZ gruppiert die Anzahl der Patienten (gesamt), Anzahl der Kassenpatienten und Anzahl der Privatpatienten ausgegeben werden soll, die innerhalb eines Zeitraums erschinen sind, also:

PLZ Alle K-Patienten P-Patienten
10000 10 7 3
11000 4 4 0
12000 2 0 2

Diese Informationen muss ich mir aus den Tabellen Patient, PAdresse und PEpisode in Kombination holen. In PEpisode steht die Information des Abrechnungsdatums(PEp.ScheinDatum) und die Leistungsart (PEp.PrivatOderKasse mit dem Eintrag P oder K). Die Relation zwischen den Tabellen besteht im Feld IDPAT.

Meine Abfrage für alle Patienten sieht so aus:

SELECT PAd.Plz, Count (*) As 'Alle'
FROM PAdresse PAd, PEpisode PEp, Patient Pat
WHERE PAd.IDPAT=PEp.IDPAT
AND Pat.IDPAT=PAd.IDPAT
AND PEp.ScheinDatum BETWEEN '2017-01-10' AND '2017-01-11'
GROUP BY PAd.Plz, PEp.PrivatOderKasse
ORDER BY PAd.Plz

und liefert auch wunschgemäß:

PLZ Alle
10000 10
11000 4
12000 2

Wie bekomme ich die beiden zusätzlichen Spalten K-Patienten, P-Patienten in die Ausgabe ?

Vielen Dank für Eure Unterstützung ... und noch einen schönen Sonntag :)

Sqweezer
 
Moin sqeezer,

die klassische Lösungsstrategie in jedem SQL-Dialekt ist dafür ein "SELECT CASE WHEN ..THEN..END"-Konstrukt.

Das füllt sieht zwar oft etwas umständlich aus (weil so viel Getippsel), aber wird von jeder Datenbank verstanden und ist lesbar/wartbar.
SQL:
SELECT PAd.Plz, Count (*) As 'Alle'
, sum(case  when PEp.PrivatOderKasse='P' then 1 ELSE 0 END ) as Privat
, sum(case  when PEp.PrivatOderKasse='K' then 1 ELSE 0 END ) as Kasse
FROM PAdresse PAd, PEpisode PEp, Patient Pat
WHERE PAd.IDPAT=PEp.IDPAT
AND Pat.IDPAT=PAd.IDPAT
AND PEp.ScheinDatum BETWEEN '2017-01-10' AND '2017-01-11'
GROUP BY PAd.Plz, PEp.PrivatOderKasse
ORDER BY PAd.Plz

Alternativ bei mySQL dasselbe mit der IF()-Funktion.
Sieht vielleicht schlanker aus; ich finde es nicht lesbarer.
SQL:
SELECT PAd.Plz, Count (*) As 'Alle'
, SUM(IF ( PEp.PrivatOderKasse='P', 1 , 0)) as Privat
, SUM(IF ( PEp.PrivatOderKasse='K', 1 , 0)) as Kasse
FROM ... (wie oben)

Oder aber ohne CASE WHEN und ohne IF()
SQL:
SELECT PAd.Plz, Count (*) As 'Alle'
, SUM(PEp.PrivatOderKasse='P') as Privat
, SUM(PEp.PrivatOderKasse='K') as Kasse
FROM ... (wie oben)

(alles ungetestet, aber gut gemeint)

Grüße
Biber
 
Hallo Biber,

vielen Dank für das ausführliche Tutorial. Das bringt mich jetzt ein ganzes Stück weiter ...:):):)

Gruß,
Sqweezer
 
Moin squeezer,

na, teste lieber erstmal vor dem Bedanken... ist ja alles nur stehend freihändig runtergetippt.
Würde mich natürlich freuen, wenn es funktioniert... aber getestet ist es nicht.

Grüße
Biber
 
Zurück