AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken InterBase Group By / Left Join / 3xgleiche Tabelle??
Thema durchsuchen
Ansicht
Themen-Optionen

InterBase Group By / Left Join / 3xgleiche Tabelle??

Ein Thema von Agasch · begonnen am 13. Apr 2014 · letzter Beitrag vom 28. Apr 2014
Antwort Antwort
Seite 1 von 2  1 2      
Agasch

Registriert seit: 13. Apr 2014
8 Beiträge
 
#1

InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 06:54
Datenbank: InterBase • Version: XE • Zugriff über: Delphi Prof. XE
Moin,
versuche gerade das Gruppieren/Berechnen von Daten und das Anwenden von Joins zu erlernen. Hier stehe ich aber irgendwie auf dem Schlauch....

Habe 2 Tabellen:

Tabelle: Personal
Feld: PERSONAL_ID

Daten in der Tabelle: PERSONAL_ID=1


Tabelle: FEHLTAGE
Felder: FEHLTAGE_ID, FEHLTAGE_PERSONALID, FEHLTAGE_ARBEITSTAGE, FEHLTAGE_ART
-> ART bedeutet: U(rlaub), K(rank), F(ehlt)

Daten in der Tabelle "FEHLTAGE":

FEHLTAGE_ID FEHLTAGE_PERSONALID FEHLTAGE_ART FEHLTAGE_ARBEITSTAGE
=========== =================== ============ ====================
1 1 U 10
2 1 U 7
3 1 F 1
4 1 K 5
5 1 K 2


d.h
PERSONAL_ID hat dann: 17 Tage Urlaub, 1 Tag gefehlt und 7 Tage krank gemacht.


Ich will jetzt auf die Tabelle Fehltage 3x zugreifen:

select
P.PERSONAL_ID,
Sum(U.FEHLTAGE_ARBEITSTAGE) as URLAUB,
Sum(F.FEHLTAGE_ARBEITSTAGE) as FEHLTAGE,
Sum(K.FEHLTAGE_ARBEITSTAGE) as KRANK

from PERSONAL P
LEFT JOIN FEHLTAGE U ON (U.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND U.FEHLTAGE_ART='U')
LEFT JOIN FEHLTAGE F ON (F.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND F.FEHLTAGE_ART='F')
LEFT JOIN FEHLTAGE K ON (K.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND K.FEHLTAGE_ART='K')
GROUP BY P.PERSONAL_ID


Richtig wäre:
PERSONAL_ID=1 URLAUB=17 FEHLTAGE=1 KRANK=7

Bekomme jedoch:
PERSONAL_ID=1 URLAUB=31 FEHLTAGE=4 KRANK=14


Setze ich meine SQL_Anweisung schrittweise ein, dh nur ein Left Join, bekomme ich den richtigen Wert, aber 2 oder 3 liefern die falschen Werte.
Wie müüste das richtig aussehen?

Danke im Voraus
Andreas
  Mit Zitat antworten Zitat
geesmith

Registriert seit: 17. Jan 2003
Ort: Frauenfeld
32 Beiträge
 
Delphi XE5 Architect
 
#2

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 08:48
Hi

Mit left join bist du ja grundsätzlich richtig unterwegs. Zeigt er dir die Werte ohne Group -By denn richtig an? Versuch mal den Group By in einem übergeordneten SELECT zu machen. Wäre möglich dass ein Group By direkt mit left join Probleme verursacht... also:

SELECT P.PERSONAL_ID, SUM(URLAUB),SUM(FEHLTAGE),SUM(KRANK)
FROM(
SELECT
P.PERSONAL_ID,
U.FEHLTAGE_ARBEITSTAGE as URLAUB,
F.FEHLTAGE_ARBEITSTAGE as FEHLTAGE,
K.FEHLTAGE_ARBEITSTAGE as KRANK

from PERSONAL P
LEFT JOIN FEHLTAGE U ON (U.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND U.FEHLTAGE_ART='U')
LEFT JOIN FEHLTAGE F ON (F.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND F.FEHLTAGE_ART='F')
LEFT JOIN FEHLTAGE K ON (K.FEHLTAGE_PERSONALID=P.PERSONAL_ID AND K.FEHLTAGE_ART='K')
)
GROUP BY P.PERSONAL_ID

Geht das?
  Mit Zitat antworten Zitat
Agasch

Registriert seit: 13. Apr 2014
8 Beiträge
 
#3

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 09:02
Hi, IntreBase unterstützt es leider nicht
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 09:11
Mit dem Alias U werden 2 Sätze angesprochen, mit F 1 und mit K 2.
Das Ergebnis, worauf dann das GROUP BY angewendet wird besteht also aus 2x2x1 = 4 Sätzen.
Kann also schon vom Ansatz nicht stimmen (das ist auch die Erklärung, warum bei Fehltagen eine 4 herauskommt, weil die 4 mal berücksichtigt/aufsummiert werden).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 10:59
Für Übungszwecke ist der Join zur Personaltabelle vielleicht sinnvoll, technisch aber hier vollkommen unnötig.
Du benötigst nur die Fehltagetabelle für die Ausgabe, der Join zur Personaltabelle bringt keinen Mehrwert in Deinem Beispiel.

Das wäre erst gegeben, wenn Du
a) einen weiteren Wert aus Personal ausgeben willst, z.B. Name
b) eine Liste aller Personaldaten haben willst, auch wenn gar keine Fehltage vorhanden sind.

Dann würde ich jede "Einzelmenge" (die 3 Fehlarten) separat aufsummieren und dann joinen. So müsste in deinem Beispiel eine Zeile rauskommen.
Gruß, Jo
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 11:10
Oder

SQL-Code:
select
    P.PERSONAL_ID,
    Sum(U.FEHLTAGE_ARBEITSTAGE) as URLAUB,
    Sum(F.FEHLTAGE_ARBEITSTAGE) as FEHLTAGE,
    Sum(K.FEHLTAGE_ARBEITSTAGE) as KRANK
from
    PERSONAL P
        LEFT JOIN FEHLTAGE U ON U.FEHLTAGE_PERSONALID=P.PERSONAL_ID
        LEFT JOIN FEHLTAGE F ON F.FEHLTAGE_PERSONALID=P.PERSONAL_ID
        LEFT JOIN FEHLTAGE K ON K.FEHLTAGE_PERSONALID=P.PERSONAL_ID
where
    U.FEHLTAGE_ART='U'AND F.FEHLTAGE_ART='FAND K.FEHLTAGE_ART='K'
GROUP BY
    P.PERSONAL_ID;
Markus Kinzler
  Mit Zitat antworten Zitat
Agasch

Registriert seit: 13. Apr 2014
8 Beiträge
 
#7

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 11:29
auch falsch^^

Richtig wäre:
PERSONAL_ID=1 URLAUB=17 FEHLTAGE=1 KRANK=7

Bekomme jedoch:
PERSONAL_ID=1 URLAUB=34 FEHLTAGE=4 KRANK=14
  Mit Zitat antworten Zitat
Agasch

Registriert seit: 13. Apr 2014
8 Beiträge
 
#8

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 11:03
Hi,
mein Bespiel zeigt nur das Wichtigste. Die Personaltabelle zeigt alle Informnationen und greift auf weitere Tabellen zu (Anschriften, Anreden usw). Das funktioniert auch alles, nur an der Stelle mit den Fehltagen gibs einen Fehler, daher reduzierte ich es auf minimum, bis ich den Fehler verstanden/behoben habe
  Mit Zitat antworten Zitat
jsheyer

Registriert seit: 9. Jun 2005
Ort: Jüchen
82 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 13. Apr 2014, 12:12
Hallo,

es gibt noch eine Möglichkeit, die Perfomance dabei ist natürlich im wesentlichen auch von den vorhandenen Indexen abhängig (wie fast immer )

select
P.PERSONAL_ID,
(Select sum(U.FEHLTAGE_ARBEITSTAGE) from PERSONAL U where U.ID=P.ID and U.FEHLTAGE_ART='U') as Urlaub,
(Select sum(F.FEHLTAGE_ARBEITSTAGE) from PERSONAL F where F.ID=P.ID and F.FEHLTAGE_ART='F') as Fehltage,
(Select sum(K.FEHLTAGE_ARBEITSTAGE) from PERSONAL K where K.ID=P.ID and K.FEHLTAGE_ART='K') as Krank
from PERSONAL P


evtl. muss das natürlich auf eine zeitliche Beschränkung erweitert werden, wenn man z. B. nur eine Monat betrachten möchte.
Jörg Heyer
  Mit Zitat antworten Zitat
Agasch

Registriert seit: 13. Apr 2014
8 Beiträge
 
#10

AW: InterBase Group By / Left Join / 3xgleiche Tabelle??

  Alt 28. Apr 2014, 06:03
Hi,
InterBase unterschützt leider keine doppelten Selects^^.



Habe noch ein Problem mit meiner Abfrage:

Tabelle Perosnal hat 4 Datensätze (die Tabelle besteht natürlich aus weiteren Spalten wie Name usw.)
Id
1
2
3
4

Tabelle Urlaub 18 Datensätze, eine Abfrage mit:

select
PERSONAL_ID,
Sum(FEHLTAGE_ARBEITSTAGE) as URLAUB_GENOMMEN
from PERSONAL
LEFT JOIN FEHLTAGE ON (FEHLTAGE_PERSONALID = PERSONAL_ID)
GROUP BY
PERSONAL_ID

zeigt es richtigan:
ID URLAUB_GENOMMEN
1 25
2 14
3 6
4 22

ABER möchte ich mir die Anzahl aller Personaldatensätze anzeigen und füge COUNT dazu, geht es daneben

select
PERSONAL_ID,
count(PERSONAL_ID)as Gesamt_Personal,
Sum(FEHLTAGE_ARBEITSTAGE) as URLAUB_GENOMMEN
from PERSONAL
LEFT JOIN FEHLTAGE ON (FEHLTAGE_PERSONALID = PERSONAL_ID)
GROUP BY
PERSONAL_ID

ID Gesamt_Personal URLAUB_GENOMMEN
1 5 25
2 4 14
3 3 6
4 6 22

Er rechent glaube ich die Datensätze in der Tabelle Fehltage.
Wozu ein Count? Möchte auch gern die Gesamtzahl aller Datensätze anzeigen lassen.



Wie muss die Abfrage richtig aussehen??
Kenn wer ein Buch wo man den richtigen Weg erlernen kann, um solche Abfragen zu erstellen? Meine paar Bücher schneiden diese Sachen nur an.

Solche Beispiele wie:

select count(PERSONAL_ID)as Gesamt_Personal from PERSONAL

nutzen einem sehr wenig...

Viele Grüsse
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:47 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