Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL für die Abfrage dreier Tabellen (https://www.delphipraxis.net/174394-sql-fuer-die-abfrage-dreier-tabellen.html)

barnti 19. Apr 2013 16:53

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

DeddyH 19. Apr 2013 17:14

AW: SQL für die Abfrage dreier Tabellen
 
Im ersten Impuls würde ich sagen:
SQL-Code:
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
Aber vermutlich willst Du die Summen ermitteln, oder?

Bummi 19. Apr 2013 17:18

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
http://sqlfiddle.com/#!3/75bb6/2

barnti 19. Apr 2013 18:08

AW: SQL für die Abfrage dreier Tabellen
 
Hallo,

danke für die Antworten. Ich poste mal, was ich habe

Code:
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
damit bekomme ich alle Mitarbeiter mit Vorname, Nachname und evtl vorhandene Abwesenheiten (Right outer join).

In der Arbeitszeittabelle stehen für jeden Tag pro Mitarbeiter die Arbeitsstunden. Ich muss also die Summe Arbeitsstunden noch hinzunehmen. Mein Versuch:

Code:
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
Diese Abfrage führt zu einem Fehler (Fehler im Statement). Ich denke es liegt an der Bezeichnung der Spalte mit Leerzeichen und den Quotes...

Gruß,

Barntl

Volker Z. 19. Apr 2013 22:29

AW: SQL für die Abfrage dreier Tabellen
 
Hallo,

unter der Annahme, dass Deine drei Tabellen (Kurzfassung etwas angepasst) folgendermaßen definiert sind:
Code:
Mitarbeiter (ID, Vorname, Nachname)
Arbeitszeit (ID, Mitarbeiter_ID, Stunden)
Abwesenheit (ID, Mitarbeiter_ID, Stunden)
Dann sollte Dir das folgendes SQL-Statement
SQL-Code:
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
das gewünschte Ergebnis liefern
Code:
| Name           | Arbeitszeit (Stunden) | Abwesenheit (Stunden) |
|----------------+-----------------------+-----------------------|
| Max Mustermann | 130                   | 8                     |
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?

Mit:
SQL-Code:
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
Bekommst Du zumindest
Code:
| ID | Name           | Arbeitszeit (Stunden) | Abwesenheit (Stunden) |
|---------------------+-----------------------+-----------------------|
| 27 | Max Mustermann | 60                    | 8                     |
| 81 | Max Mustermann | 70                    | 0                     |
Gruß

Bummi 19. Apr 2013 23:01

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)


http://sqlfiddle.com/#!3/491cb/1

Die Problematik der Kreuzprodukte wird so noch besser sichtbar

http://sqlfiddle.com/#!3/f23fe/1

Herkunft ungruppiert

http://sqlfiddle.com/#!3/f23fe/2

Volker Z. 20. Apr 2013 04:58

AW: SQL für die Abfrage dreier Tabellen
 
Hallo,

Zitat:

Das ist ein gefährlicher Irrtum, [...]
Jap, den Herrn Maier habe ich wohl doch tatsächlich übersehen - was muss der auch gerade mal n' bisserln größer sein als' n Gartenzwerg.

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 04:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz