Zwei Tabellen vereinigen

WantsToKnow

Neuer Benutzer
Beiträge
3
Hallo zusammen,

ich grüble gerade über eine Aufgabenstellung nach, im folgenden stark vereinfacht.

Ein Ferienhaus kann gebucht oder bemängelt werden. Dazu habe ich mir zwei Tabellen angelegt:
TBeschwerden, TBuchungen
Beide enthalten nur eine Spalte FID (int, kein Primärschlüssel, nullable). Die ID steht für ein Ferienhaus. Demnach kann ein Ferienhaus in beiden Tabellen mehrfach vorkommen.

Das gewünschte Ergebnis ist: Ferienhaus, Beschwerden, Buchungen

Derzeit bekomme ich es nur in zwei Tabellen hin:
Code:
select fid Ferienhaus, COUNT(fid) Beschwerden from tbeschwerden tbe
group by fid
select fid Ferienhaus, COUNT(fid) Buchungen from tbuchungen tbu
group by fid

Der Versuch nur eine Tabelle als Ergebnis zu bekommen scheitert:
Code:
select tbe.fid Ferienhaus, COUNT(tbe.fid) Beschwerden, COUNT(tbu.fid) Buchungen from tbeschwerden tbe, tbuchungen tbu
where tbe.fid = tbu.fid
group by tbe.fid, tbu.fid

Inhalt der Beispieltabellen und Ergebnisse im Anhang.

Vielen Dank im Voraus!

EDIT: Die zweite Abfrage habe ich nun an das Beispiel angepasst.
 

Anhänge

  • Daten und Ergebnisse.pdf
    96,4 KB · Aufrufe: 5
Werbung:

Tommi

Datenbank-Guru
Beiträge
284
Hi,

Deine zweite, gejointe Abfrage funktioniert nicht, weil du den Falschen Verknüpfungsschlüssel verwendet hast.
So wie ich es verstanden habe wird das Ferienhaus über die Spalte ID (und nicht FID) identifiziert.
Wenn du aus zwei Tabellen das gleiche Ferienhaus betrachtest, muss also die ID (und nicht die FID) gleich sein.
FID identifiziert ja den Datensatz in den jeweiligen Tabellen Buchungen und Beschwerden (wenn ich das richtig verstanden habe).

Ich würde allerdings die Tabelle Buchungen als führende Tabelle nehmen, da ohne eine Buchung nur schwerlich Beschwerden zustande kommen.

Deine Abfrage würde dann wie folgt aussehen:
Code:
SELECT BU.ID as Ferienhaus_ID
  , COUNT(BU.FID) as Buchungen,
  , COUNT(BS.FID) as Beschwerden
FROM Buchungen BU
LEFT OUTER JOIN Beschwerden BS
     ON BU.ID=BS.ID
GROUP BY BU.ID

Viele GRüße,
Tommi
 

WantsToKnow

Neuer Benutzer
Beiträge
3
Nein, es gibt in beiden nur die Spalte FID. Ich habe die Beispieldaten im ersten Post angehängt.
Wenn ich deine Frage anpasse (ID - die es nicht gibt - durch FID ersetzen), dann ergibt es das gleiche wie bei meiner zweiten:
Code:
SELECT BU.fid as Ferienhaus_ID
  , COUNT(BU.FID) as Buchungen
  , COUNT(BS.FID) as Beschwerden
FROM TBuchungen BU
LEFT OUTER JOIN TBeschwerden BS
     ON BU.fid=BS.fid
GROUP BY BU.fid

Immer noch das falsche Ergebnis.
 

Tommi

Datenbank-Guru
Beiträge
284
Hi,

wie identifizierst du denn dann die Beschwerde selbst in der Beschwerde-Tabelle?
Du kannst hier doch nicht einfach nur die ID des Ferienhauses mitführen! Die Tabelle muss doch einen Hauptidentifizierer haben!

Das war nämlich der Ansatz meiner Antwort. Wenn ein Hauptidentifizierer in den vom Ferienhaus abhängigen Tabellen fehlt, solltest du diesen noch hinzufügen,
ansosten wäre der Datenbankaufbau nicht sicher gegen Inkonsistenz!
Dann kannst du die Anzahl dieser Hauptidentifizierer in den Untertabellen zählen.

Als Lösung zum bestehenden Beispiel kannst du dir aber auch mit einer Unterabfrage helfen.
Das sähe dann so aus:

Code:
SELECT BU.FID as Ferienhaus
, COUNT(*) as Buchungen
,(SELECT COUNT(*) FROM Beschwerden BS WHERE BU.FID=BS.FID) as Beschwerden
FROM Buchungen BU
GROUP BY BU.FID

Viele Grüße,
Tommi
 
Werbung:

WantsToKnow

Neuer Benutzer
Beiträge
3
Die Datenbank und die beschriebenen Tabellen sind natürlich etwas umfangreicher.
Aber mir schien, dass es für Aufgabenstellung ausreichend wäre.

Ja, mit dieser Abfrage hat's funktioniert. Danke dir!
 
Oben