AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL für die Abfrage dreier Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL für die Abfrage dreier Tabellen

Ein Thema von barnti · begonnen am 19. Apr 2013 · letzter Beitrag vom 20. Apr 2013
Antwort Antwort
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#1

SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 16:53
Datenbank: OpenOffice Base • Version: 4.2 • Zugriff über: OO Base (HSQL)
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
Gruß,

Barnti
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 17:14
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 17:18
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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (20. Apr 2013 um 00:02 Uhr)
  Mit Zitat antworten Zitat
barnti

Registriert seit: 15. Aug 2003
Ort: Mal hier mal da...
689 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 18:08
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
Gruß,

Barnti
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

AW: SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 22:29
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: SQL für die Abfrage dreier Tabellen

  Alt 19. Apr 2013, 23:01
@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
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi (20. Apr 2013 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#7

AW: SQL für die Abfrage dreier Tabellen

  Alt 20. Apr 2013, 04:58
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ß
Volker Zeller
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:58 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