AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SELECT über mehrere Tabelle ergibt nichts brauchbares
Thema durchsuchen
Ansicht
Themen-Optionen

SELECT über mehrere Tabelle ergibt nichts brauchbares

Ein Thema von scrat1979 · begonnen am 3. Feb 2010 · letzter Beitrag vom 4. Feb 2010
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 06:30
Datenbank: firebird • Version: 2 • Zugriff über: IBDAC
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
Michael Kübler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 06:48
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
Heiko
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 07:53
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 07:55
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
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 09:20
Ich werde es gleich heute Abend ausprobieren und bescheidgeben. Sollte das funktionieren, wäre das echt ein Segen

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 16:06
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 ~~~
Michael Kübler
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 16:15
Hallo,

zeig' mal bitte Deine Anpassungen, bei solchen Spielereien bin ich immer seeeeeeehr neugierig
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 3. Feb 2010, 18:55
Zitat von nahpets:
Hallo,

zeig' mal bitte Deine Anpassungen, bei solchen Spielereien bin ich immer seeeeeeehr neugierig
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
Michael Kübler
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: SELECT über mehrere Tabelle ergibt nichts brauchbares

  Alt 4. Feb 2010, 10:34
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
  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 06:55 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