Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zwei Tabellen vereinigen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von WantsToKnow, 21 November 2012.

  1. WantsToKnow

    WantsToKnow Neuer Benutzer

    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:

  2. Tommi

    Tommi Datenbank-Guru

    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
     
  3. WantsToKnow

    WantsToKnow Neuer Benutzer

    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.
     
  4. Tommi

    Tommi Datenbank-Guru

    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
     
    ukulele und WantsToKnow gefällt das.
  5. WantsToKnow

    WantsToKnow Neuer Benutzer

    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!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden