birdyb
Goto Top

SQL: Anzahl von Datensätzen bei JOIN

Hallo zusammen,

ich stehe gerade etwas auf dem Schlauch und hoffe auf eure Hilfe.
Gegeben sind in unserer SQL Datenbank zwei Tabellen
1) Personal
PERSONAL_ID | PERSONAL_Name1 | PERSONAL_Name2 | ...
2) Einsatz
EINSATZ_ID | EINSATZ_DATUM | PERSONAL_ID | ...

Ich möchte gerne eine Aufstellung darüber erstellen, welcher Mitarbeiter wieviele Einsätze absolviert hat und dabei auch die Mitarbeiter angezeigt bekommen, die keine Einsätze absolviert haben.
Also habe ich mir gedacht, ich selektiere alle Mitarbeiter aus der Personal-Tabelle und Joine die Einsatztabelle daran. Meine Abfrage sieht jetzt so aus:

SELECT
PERSONAL.PERSONAL_NAME1,
COUNT(EINSATZ.EINSATZ_ID) as Anzahl
FROM PERSONAL
LEFT JOIN EINSATZ ON PERSONAL.PERSONAL_ID = EINSATZ.PERSONAL_ID
GROUP BY PERSONAL.PERSONAL_NAME1

Leider werden hier die Mitarbeiter ohne Einsätze nicht angezeigt und ich komme an dieser Stelle nicht weiter. Ich hatte es so verstanden, dass der LEFT JOIN auf jeden Fall alle Datensätze aus der Personal-Tabelle anzeigt.

Für etwas Hilfe wäre ich euch sehr dankbar.

Beste Grüße!

Content-Key: 368768

Url: https://administrator.de/contentid/368768

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: em-pie
em-pie 21.03.2018 aktualisiert um 10:43:42 Uhr
Goto Top
Moin,

Hmm.. kenne deine Tabelle inhaltlich jetzt nicht (kann ich mir aber vorstellen).

Wenn du mal das "Group by" weg lässt, wie sieht dann dein Ergebnis aus?
Erhältst du dann bei "EinsatzID" ein NULL ?

Wenn ja, ist deinSQL-Statement per se schon mal korrekt.
Ein Proble gibt es, wenn du NULL-Werte zählen möchtest.
Siehe dazu auch:
https://stackoverflow.com/questions/40679208/count-includes-null-values/ ...

Du könntest das Problem "umgehen", wenn du folgendes versuchst (ungetestet)

select
 PERSONAL.PERSONAL_NAME1
 , ISNULL(EINSATZ.COUNTER, 0) as ANZAHL
from
 PERSONAL
left join
 (select PERSONAL_ID, count(*) as COUNTER from EINSATZ group by PERSONAL_ID) as EINSATZ on PERSONAL.PERSONAL_ID = EINSATZ.PERSONAL_ID

Hinweis: ISNULL() stammt aus dem MS SQL-Repertoire. Für andere SQL-Systeme müsstest du analog danach schauen

Gruß
em-pie
Mitglied: ukulele-7
ukulele-7 21.03.2018 um 14:13:02 Uhr
Goto Top
Also der LEFT JOIN sollte alle Datensätze berücksichtigen, auch solche, bei denen kein Datensatz in "EINSATZ" vor kommt. Hast du eventuell etwas raus gekürzt?

Das andere Problem ist das zählen. count() zählt jede Zeile, also auch solche die NULL sind. Mein Vorschlag:
SELECT
PERSONAL.PERSONAL_NAME1,
SUM(CASE WHEN EINSATZ.EINSATZ_ID IS NULL THEN 0 ELSE 1 END) as Anzahl
FROM PERSONAL
LEFT JOIN EINSATZ ON PERSONAL.PERSONAL_ID = EINSATZ.PERSONAL_ID
GROUP BY PERSONAL.PERSONAL_NAME1