![]() |
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 |
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 |
Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
Hallo,
unter MSSQL und/oder Oracle könnte es in der Form funktionieren:
SQL-Code:
Ist halt nur hingedaddelt und nicht getestet.
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; 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. |
Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
Zitat:
Kann man auch als SP implementieren, welche dann das Ergebnis direkt liefert |
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 |
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 ~~~ :) |
Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
Hallo,
zeig' mal bitte Deine Anpassungen, bei solchen Spielereien bin ich immer seeeeeeehr neugierig :wink: |
Re: SELECT über mehrere Tabelle ergibt nichts brauchbares
Zitat:
|
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 11:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz