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
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:
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!
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!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 368768
Url: https://administrator.de/forum/sql-anzahl-von-datensaetzen-bei-join-368768.html
Ausgedruckt am: 11.04.2025 um 13:04 Uhr
2 Kommentare
Neuester Kommentar
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)
Hinweis: ISNULL() stammt aus dem MS SQL-Repertoire. Für andere SQL-Systeme müsstest du analog danach schauen
Gruß
em-pie
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
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:
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