![]() |
Datenbank: OpenOffice Base • Version: 4.2 • Zugriff über: OO Base (HSQL)
SQL für die Abfrage dreier Tabellen
Hallo zusammen,
leider muss ich feststellen, dass mein SQL total eingerostet ist. Deshalb nun meine Frage: Ich habe drei Tabellen (Kurzfassung): Mitarbeiter (ID, Name) Arbeitszeit (ID, Mitarbeiter_ID, Arbeitszeit (Stunden)) Abwesenheit (ID, Mitarbeiter_ID, Abwesenheit (Stunden)) In der ersten Tabelle stehen die Stammdaten des Mitarbeiters. In der zweiten die geleisteten Arbeitsstunden. In der dritten die Abwesenheiten(Urlaub, Krank). Mitarbeiter-Arbeitszeit (1:n) Mitarbeiter-Abwesenheit (1:n) Ich möchte nun die Arbeitszeit und Abwesenheitszeit pro Mitarbeiter ausgeben. In etwas: Name | Arbeitszeit (Stunden) | Abwesenheit (Stunden) Max Muster | 130 | 8 Ich krieg es nicht gebacken. Was ich schaffe ist zwei Tabellen miteinander zu joinen, also Arbeitsstunden pro mitarbeiter oder Abwesenheit pro Mitarbeiter auszugeben. Leider aber nicht beides zusammen. Kann mir bitte jemand behilflich sein? Danke & Gruß, Barntl |
AW: SQL für die Abfrage dreier Tabellen
Im ersten Impuls würde ich sagen:
SQL-Code:
Aber vermutlich willst Du die Summen ermitteln, oder?
SELECT
M.Name, Z.Arbeitszeit, A.Abwesenheit FROM Mitarbeiter M JOIN Arbeitszeit Z ON Z.Mitarbeiter_ID = M.ID JOIN Abwesenheit A ON A.Mitarbeiter_ID = M.ID |
AW: SQL für die Abfrage dreier Tabellen
Ich kenne die Datenbank nicht ...
Code:
Select ID,Name
,(Select SUM(Stunden) from Arbeitszeit where Arbeitszeit.Mitarbeiter_ID=Mitarbeiter .ID) as Arbeitszeit ,(Select SUM(Stunden) from Abwesenheit where Abwesenheit.Mitarbeiter_ID=Mitarbeiter .ID) as Abwesenheit from Mitarbeiter ![]() |
AW: SQL für die Abfrage dreier Tabellen
Hallo,
danke für die Antworten. Ich poste mal, was ich habe
Code:
damit bekomme ich alle Mitarbeiter mit Vorname, Nachname und evtl vorhandene Abwesenheiten (Right outer join).
SELECT
Mitarbeiterstammdaten.Vorname, Mitarbeiterstammdaten.Nachname,SUM( "Ausfallzeit" ) FROM Abwesenheit RIGHT OUTER JOIN Mitarbeiterstammdaten on Abwesenheit.Mitarbeiter_ID = Mitarbeiterstammdaten.ID GROUP BY Mitarbeiterstammdaten.Vorname, Mitarbeiterstammdaten.Nachname In der Arbeitszeittabelle stehen für jeden Tag pro Mitarbeiter die Arbeitsstunden. Ich muss also die Summe Arbeitsstunden noch hinzunehmen. Mein Versuch:
Code:
Diese Abfrage führt zu einem Fehler (Fehler im Statement). Ich denke es liegt an der Bezeichnung der Spalte mit Leerzeichen und den Quotes...
SELECT
Mitarbeiterstammdaten.Vorname, Mitarbeiterstammdaten.Nachname,SUM( "Ausfallzeit" ), SUM(Nettozeitenreport.handlingtime(sec)) FROM Abwesenheit RIGHT OUTER JOIN Mitarbeiterstammdaten on Abwesenheit.Mitarbeiter_ID = Mitarbeiterstammdaten.ID RIGHT OUTER JOIN Nettozeitenreport on Nettozeitenreport.name = 'Mitarbeiterstammdaten.Name (Nettozeitenreport)' GROUP BY Mitarbeiterstammdaten.Vorname, Mitarbeiterstammdaten.Nachname Gruß, Barntl |
AW: SQL für die Abfrage dreier Tabellen
Hallo,
unter der Annahme, dass Deine drei Tabellen (Kurzfassung etwas angepasst) folgendermaßen definiert sind:
Code:
Dann sollte Dir das folgendes SQL-Statement
Mitarbeiter (ID, Vorname, Nachname)
Arbeitszeit (ID, Mitarbeiter_ID, Stunden) Abwesenheit (ID, Mitarbeiter_ID, Stunden)
SQL-Code:
das gewünschte Ergebnis liefern
SELECT "Mitarbeiter"."Vorname" + SPACE (1) + "Mitarbeiter"."Nachname" AS Name, SUM( "Arbeitszeit"."Stunden" ) AS "Arbeitszeit (Stunden)", SUM( "Abwesenheit"."Stunden" ) AS "Abwesenheit (Stunden)"
FROM Mitarbeiter LEFT OUTER JOIN "Arbeitszeit" ON "Mitarbeiter"."ID" = "Arbeitszeit"."Mitarbeiter_ID" LEFT OUTER JOIN "Abwesenheit" ON "Mitarbeiter"."ID" = "Abwesenheit"."Mitarbeiter_ID" GROUP BY Name
Code:
Ich kenne jetzt zwar den Rest Deiner Tabellendefinitionen nicht, aber denk mal darüber nach, welchen Informationsgehalt obiges Ergebnis hat, wenn in der Entwicklungsabteilung ein Max Mustermann an neuen Gebrauchsmustern tüftelt und gleichzeitig - weder verwandt noch verschwägert - in der konzerneigenen Kantine ein Max Mustermann (unterschiedlichen Mitarbeiter ID) für das Scheuern gebrauchter Töpfe und Pfannen zuständig ist? Wie teilen sich dann die Anwesenheits- und Abwesenheitsstunden auf?
| Name | Arbeitszeit (Stunden) | Abwesenheit (Stunden) |
|----------------+-----------------------+-----------------------| | Max Mustermann | 130 | 8 | Mit:
SQL-Code:
Bekommst Du zumindest
SELECT "Mitarbeiter"."ID" AS ID, "Mitarbeiter"."Vorname" + SPACE (1) + "Mitarbeiter"."Nachname" AS Name, SUM( "Arbeitszeit"."Stunden" ) AS "Arbeitszeit (Stunden)", SUM( "Abwesenheit"."Stunden" ) AS "Abwesenheit (Stunden)"
FROM Mitarbeiter LEFT OUTER JOIN "Arbeitszeit" ON "Mitarbeiter"."ID" = "Arbeitszeit"."Mitarbeiter_ID" LEFT OUTER JOIN "Abwesenheit" ON "Mitarbeiter"."ID" = "Abwesenheit"."Mitarbeiter_ID" GROUP BY "Mitarbeiter"."ID", Name
Code:
Gruß
| ID | Name | Arbeitszeit (Stunden) | Abwesenheit (Stunden) |
|---------------------+-----------------------+-----------------------| | 27 | Max Mustermann | 60 | 8 | | 81 | Max Mustermann | 70 | 0 | |
AW: SQL für die Abfrage dreier Tabellen
@VolkerZ
Das ist ein gefährlicher Irrtum, nimm einfach an Herr Maier hat 3 Anwesenheitsdatensätze a 8 Stunden und einen Abwesenheitsdatensatz a 5 Stunden, dann bekommst Du auf die Art 24 Stunden Anwesenheit (richtig) und 15 Stunden Abwesenheit (falsch) ![]() Die Problematik der Kreuzprodukte wird so noch besser sichtbar ![]() Herkunft ungruppiert ![]() |
AW: SQL für die Abfrage dreier Tabellen
Hallo,
Zitat:
Ich wollte nur anmerken, dass womöglich - ggf. aus Unkenntniss der tatsächlichen Gegebenheiten resultierend - sich Ungereimtheiten auftun, über die man nochmals nachdenken könnte; keinesfalls wollte ich den Irrtümern dieser Welt Vorschub leisten. Über den Teil ab "Mit:" meines Posts hätte ich wohl besser vorab etwas gründlicher nachdenken sollen. @ TE: sorry dafür @Bummi: Vielen Dank für den Hinweis Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz