Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SELECT über mehrere Tabelle ergibt nichts brauchbares (https://www.delphipraxis.net/147174-select-ueber-mehrere-tabelle-ergibt-nichts-brauchbares.html)

scrat1979 3. Feb 2010 06:30

Datenbank: firebird • Version: 2 • Zugriff über: IBDAC

SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Hallo,

seitdem ich meine Datenbankstruktur umgestellt habe, bekomme ich folgende Situation nicht in den Griff. Habe schon jede Kombination aus JOIN und UNION ausprobiert, leider ohne Erfolg:

Hier die Tabellenstrukturen, reduziert auf die nötigsten spalten:

Tablle "DIENSTE". Es gibt drei Diensttypen (1. Dienst [1], 2. Dienst [2] und Notarzt [3]

FKDATUM | DIENSTTYP | FKDOC
------------------------------------
02.02.2010 1 1
02.02.2010 2 8
02.02.2010 3 17


Tabelle DOCS:

DOCID | DOCNAME
---------------
1 Testinchen
[...]
8. Müller
17. Meier

Nun möchte ich eine Abfrage erstellen, daß folgendes Ergebnis herauskommt, also praktisch eine Monatsübersicht in Form eines Kalenders.

DATUM DIENST1 DIENST2 DIENST3
================================================
02.02.2010 Testinchen Müller Meier
[...]

sowohl mit joins als auch mit unions bin ich gescheitert. Bei den Joins hakt es an den verschiedenen DienstTypen, bei den Unios bekomme ich zumindest mal das Ergebnis in 3 Zeilen, allerdings habe ich es noch nicht hinbekommen, die 3 Zeilen zu "verschmelzen".

Ich hoffe, ihr könnt mir dabei ein wenig helfen und vielen Dank im Voraus

SCRaT

hoika 3. Feb 2010 06:48

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Hallo,

ist dass dann eine Pivot-Tabelle ?
Sowas kennt FB (noch) nicht.

Entweder du baust das per Join mit Ergebnis

2.2. Dienst1 Doc1
2.2. Dienst2 Doc2

packst das dann in eigene Daten-Strukturen,
und zeigst es in einem StringGrid an.

Oder eine Stored Procedure.


Heiko

nahpets 3. Feb 2010 07:53

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Hallo,

unter MSSQL und/oder Oracle könnte es in der Form funktionieren:
SQL-Code:
select fkDatum,
       Max(Dienst1) as Dienst1,
       Max(Dienst2) as Dienst2,
       Max(Dienst3) as Dienst3
from
(
  select
    fkdatum,
    case when diensttyp = 1 then DocName else '.' end as Dienst1,
    case when diensttyp = 2 then DocName else '.' end as Dienst2,
    case when diensttyp = 3 then DocName else '.' end as Dienst3
  from
  (
    select FKDatum,
           Diensttyp,
           DOCName
    from dienste,
          docs
    where dienste.fkdoc = docs.docid
  ) intern1
) intern2
group by fkDatum;
Ist halt nur hingedaddelt und nicht getestet.

Kleiner Erklärungsversuch von innen nach außen:

Zuerst die gewünschten Spalten der beiden Tabellen zu einer Ergebnismenge zusammenfügen. Hier erhalten wir pro Datum und Dienst eine Zeile (intern1).

Nun per Case die Dienste auf drei Spalten aufteilen, der Wert zum Dienst geht in die entsprechende Spalte, ist der Diensttyp "unpassend" einen Punkt ausgeben.

Nun haben wir je Datum und Dienst weiterhin eine Zeile, die Dienste aber auf Spalten separiert.

Um das nun zu einer Zeile je Datum zu bekommen, müssen wir den höchsten Wert je Dienst ermitteln und auf Datumsebene gruppieren. Davon ausgehend, dass das '.' immer kleiner ist als DocName, sollte das Ergebnis stimmen. '.' kann durch einen anderen Wert ersetzt werden, der auf jeden Fall kleiner als der kleinste DocName ist.

mkinzler 3. Feb 2010 07:55

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Zitat:

unter MSSQL und/oder Oracle könnte es in der Form funktionieren
Sollte unter Firebird ebenso funktionieren.

Kann man auch als SP implementieren, welche dann das Ergebnis direkt liefert

scrat1979 3. Feb 2010 09:20

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Ich werde es gleich heute Abend ausprobieren und bescheidgeben. Sollte das funktionieren, wäre das echt ein Segen :)

SCRaT

scrat1979 3. Feb 2010 16:06

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Also, das funktioniert - mit winzigen Anpassungen an meinen Bedarf - PERFEKT!

Das mit dem CASE...END in der Abfrage war der Schlüssel zum Erfolg!

Vielen Dank...

SCRaT


~~~ ERLEDIGT ~~~ :)

nahpets 3. Feb 2010 16:15

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Hallo,

zeig' mal bitte Deine Anpassungen, bei solchen Spielereien bin ich immer seeeeeeehr neugierig :wink:

scrat1979 3. Feb 2010 18:55

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Zitat:

Zitat von nahpets
Hallo,

zeig' mal bitte Deine Anpassungen, bei solchen Spielereien bin ich immer seeeeeeehr neugierig :wink:

Prinzipiell gerne! Es handelt sich bei den Anpassungen momentan nicht um die Syntax, habe lediglich noch ein Union All - Statement hinzugefügt, damit die anderen "Tage", in welchen noch keine Einträge sind auch hinzugefügt werden und dann habe ich noch einige Spalten hinzugefügt. Aber ich schau mal auf Grundlage Deiner (genialen :) ) Lösung nach einer Optimierung, ob ich noch ein Subselect sparen kann. Ich denke, ich hätte es auf grund des CASE-Statements mit einem Subselect weniger hinbekommen. Sobald ich Zeit habe und es funktioniert, werde ich es natürlich posten. Wenn es nicht funktioniert, sage ich auch bescheid :oops:

omata 4. Feb 2010 10:34

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
 
Hier noch mal eine kürzere Version...
SQL-Code:
SELECT fkDatum,
       MAX(Dienst1) AS Dienst1,
       MAX(Dienst2) AS Dienst2,
       MAX(Dienst3) AS Dienst3
FROM (SELECT FKDatum,
             CASE WHEN diensttyp = 1 THEN DocName ELSE '.' END AS Dienst1,
             CASE WHEN diensttyp = 2 THEN DocName ELSE '.' END AS Dienst2,
             CASE WHEN diensttyp = 3 THEN DocName ELSE '.' END AS Dienst3
      FROM dienste d1
      INNER JOIN docs d2
        ON d1.fkdoc = d2.docid) x
GROUP BY fkDatum


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:54 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