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 2 von 3     12 3      
jsheyer

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

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

  Alt 13. Apr 2014, 13: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
 
#12

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

  Alt 28. Apr 2014, 07: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
Dejan Vu
(Gast)

n/a Beiträge
 
#13

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

  Alt 28. Apr 2014, 07:53
ABER möchte ich mir die Anzahl aller Personaldatensätze anzeigen und füge COUNT dazu, geht es daneben
...Wozu ein Count? Möchte auch gern die Gesamtzahl aller Datensätze anzeigen lassen.
Welche 'Gesamtanzahl aller Datensätze'? Willst Du wissen, wie oft eine PersonalID in der Tabelle 'Fehltage' vorkommt? Dann zähle 'COUNT(FEHLTAGE_ID)'.
  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
 
#14

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

  Alt 28. Apr 2014, 10:46
Es wäre schön, wenn für SQL-Code zumindest die CODE-Tags
(das sind die DELPHI-Tags)
Code:
[DELPHI]
[/DELPHI]
benutzt werden
Code:
select * 
from foo
besser noch CODE=SQL
SQL-Code:
select *
from foo
Tabellen-Inhalte können hier sehr schön mit den TABLE-Tags präsentiert werden
(siehe dazu folgenden Beitrag http://www.delphipraxis.net/1253363-post4.html )

Der Count macht doch alles richtig, der zählt wie oft in der Selektionsmenge ein Wert für PERSONAL_ID existiert (also nicht NULL ist).
Aber hast du dir Gedanken gemacht, wie die Selektionsmenge aussieht?
SQL-Code:
select *
from PERSONAL
left join FEHLTAGE on (FEHLTAGE_PERSONALID = PERSONAL_ID)
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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#15

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

  Alt 28. Apr 2014, 15:12
Eigentlich ist die von jsheyer gepostete Abfrage im Prinzip schon optimal.
SQL-Code:
select
  P.PERSONAL_ID,
  count(P.PERSONAL_ID) as Gesamt_Personal,
  (Select sum(U.FEHLTAGE_ARBEITSTAGE) from FEHLTAGE U where (U.FEHLTAGE_PERSONALID = P.PERSONAL_ID) and (U.FEHLTAGE_ART = 'U')) as URLAUB_GENOMMEN,
from PERSONAL P
  Mit Zitat antworten Zitat
Agasch

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

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

  Alt 28. Apr 2014, 15:17
Hast recht, verständlicher ist diese Variante:

PERSONAL_IDGesamt_PersonalURLAUB_GENOMMEN
1525
2414
336
4622

Also, wozu Count? Ist nur als Info gedacht (ähnlich wie früher RecordCount bei BDE), um zu zeigen wie viele Datensätze nach der aktuellen Abfrage zu Verfügung stehen.
Gezählt sollen in dem Fall allerdings NUR die Datensätze aus der Personaltabelle (also wie viele Personen gibt es), also in der Spalte: Gesamt_Personal müsste überall eine 4 stehen.
würde ich aus dem Text alles was FEHLTAGE angeht entfernen, zeig er die 4 auch richtig an.
Wie Sir Rufo schon sagte, er zeigt wie oft PERSONAL_ID in Tabelle-FEHLTAGE vorkommt, was ich aber nicht haben möchte.
Beschäftige mich gerade mit Stored Proceduren, um zu sehen, was ich vom Server ausrechnen lassen kann

InterBase meldet sofort einen Fehler:
select
P.PERSONAL_ID,
count(P.PERSONAL_ID) as Gesamt_Personal,
(Select sum(U.FEHLTAGE_ARBEITSTAGE) from FEHLTAGE U where (U.FEHLTAGE_PERSONALID = P.PERSONAL_ID) and (U.FEHLTAGE_ART = 'U')) as URLAUB_GENOMMEN,
from PERSONAL P

Wie ich schon paar Mal gesagt habe, InterBase XE unterschützt leider keine doppelten Selects^^.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#17

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

  Alt 28. Apr 2014, 15:28
Was kommt den für ein Fehler?
Das ist ein ganz normales Inner-Select, das gabs schon bei Interbase 6.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

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

  Alt 28. Apr 2014, 15:38
Zitat:
Wie ich schon paar Mal gesagt habe, InterBase XE unterschützt leider keine doppelten Selects^^.
Was verstehst Du untere einem doppelten Select?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#19

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

  Alt 28. Apr 2014, 15:42
Ich weiß ja nicht wohin du das Ergebnis des SQL-Befehls schreibst, aber sollte es ein TDataset oder ein Nachfahre davon sein, gäbe es dafür auch TDataSet.RecordCount.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
Agasch

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

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

  Alt 28. Apr 2014, 16:21
zum testen nehme ich die IBConsole

Fehler:
Error at Line 1 -Attempt to execute an unprepared dynamic SQL statement
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 06:40 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