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

Vergleich von zwei Tabellen über eine dritte Abgleichtabelle

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Patanegra77, 20 Juni 2017.

  1. Patanegra77

    Patanegra77 Benutzer

    Hallo,
    bisher war ich nur stummer, aber begeisterter Leser dieses tollen Forums, aber nun habe ich leider keine Antwort zu meinem Problem gefunden und poste selber mal:

    Es geht bei den Daten um Zählungen aus mehreren Perspektiven, die später dann zusammengeführt und verglichen werden sollen. Ich habe 3 Tabellen, die zB so aussehen (in den Aufzählungspunkten die Spaltenüberschrift):

    Gesamttzählung_Luft
    • Datum
    • Gegend
    • Anzahl A
    • Anzahl B
    Einzelzählung_Gegend A
    • Datum
    • Anzahl A
    • Anzahl B
    Einzelzählung_Gegend B
    • Datum
    • Anzahl A
    • Anzahl B
    Ich will jetzt also eine View erstellen, in der geprüft wird, ob die Einzelzählungen das gleiche Ergebnis wie die Gesamtzählung ergeben haben, also nebeneinander gestellt werden, z.B. so:

    Vergleich_Gesamt_zu_Einzel
    • Datum
    • Gegend
    • Anzahl A Gesamtzählung
    • Anzahl A Einzelzählung
    • Anzahl B Gesamtzählung
    • Anzahl B Einzelzählung
    Ich muss also irgendwie Gesamtzählung_Luft.Gegend vergleichen mit den jeweiligen Gegenden aus den Einzelzählungen. Problem: Gegend A heißt für den Einzelzähler "mein_Ort" und Gegend B heißt für den Einzelzähler "Unsere_Stadt".
    D.h. ich benötige eigentlich noch eine Übersetzungstabelle:

    Übersetzung
    • Bezeichnung Gesamtzählung
    • Bezeichnung Einzelzählung
    Diese Tabelle hätte dann nur 2 Zeilen, nämlich:

    Bezeichnung Gesamtzählung, Bezeichnung Einzelzählung;
    Gegend A, mein_Ort;
    Gegend B, Unsere_Stadt;

    Jetzt die Frage: Wie verjoine ich so eine Übersetzungstabelle in einer Selectauswahl. Ich will also Daten aus den 3 Tabellen von den Stellen, wo die Bezeichnungen gemäß Übersetzungstabelle übereinstimmen.

    Vielleicht habt ihr eine zündende Idee oder eine viel bessere Konzeption als diese Übersetzungstabelle für den leider defitiven Fall, dass die Bezeichnungen der Gegenden unterschiedlich sind.

    Danke und LG

    Christian
     
  2. Patanegra77

    Patanegra77 Benutzer

    Mir ist gerade die Idee gekommen, dass die Tabelle Übersetzung ja noch um eine ID erweitert werden könnte, also

    Übersetzung
    • ID_Gegend
    • Bezeichnung Gesamtzählung
    • Bezeichnung Einzelzählung
    Und immer wenn ein Daten in eine der drei Tabellen geschrieben wird, müsste ein Abgleich erfolgen und die ID_Gegend als eindeutige ID hinzugeschrieben werden.
    Die anderen 3 Tabellen bekommen dann also auch noch eine Spalte "ID_Gegend".
    Dann ist es vielleicht viel einfacher den Join durchzuführen.

    Nur wie funktioniert es, dass ID_Gegend aus der Zeile in Übersetzung in Gesamtzählung_Luft.ID_Gegend geschrieben wird, an der Übersetzung.Bezeichnung Gesamt = Gesamtzählung_Luft.Gegend ist?
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Mir fällt es grad schwer, zu verstehen, was Du willst. Ich bin mir aber sehr sicher, daß es was mit Primary Keys und Foreign Keys zu tun hat.
     
  4. ukulele

    ukulele Datenbank-Guru

    Du zeigst auf was du vergleichen willst aber wir kennen deine Ausgangsdaten nicht. Wie sehen denn die konkreten Tabellen und Spalten aus aus denen deine Daten verglichen werden sollen, stehen die alle in der selben Tabelle? Zeig am besten Beispieldaten.
     
  5. Patanegra77

    Patanegra77 Benutzer

    Ich habe mal eine beispielhafte Tabellenübersicht erstellt und mit angehängt. Die ersten 3 Tabellen sind die Datentabellen mit den Zählungen, dann die Übersetzungstabelle und ganz unten das Resultat, das ich in einer View zur Verfügung stellen will.

    Vielen Dank im voraus für Eure Ideen
    Chris

    Tabellenansicht1.jpg
     
  6. ukulele

    ukulele Datenbank-Guru

    Also an dem Datenmodell gibt es einiges auszusetzen, besteht die Möglichkeit das zu ändern und zu normalisieren? Die ersten drei Tabellen sind eigentlich eine Tabelle mit zwei weiteren Spalte für die Zählung und die Gegend.

    Wenn nicht gibt es zwei Möglichkeiten: dynamisches SQL (sehr komplex, fehleranfällig) oder viel Handarbeit. Über wieviele Teilzählungen reden wir hier, mehr als die zwei?
     
  7. Patanegra77

    Patanegra77 Benutzer

    Hallo,

    erstmal vielen Dank für deine Einschätzung.

    Also es sind tatsächlich so um 10-15 Teilzählungen und es können immer neue hinzukommen.

    Im Prinzip spricht nichts dagegen, dass alles in eine große Tabelle geschrieben wird. Das Problem ist nur, dass bei den Teilzählungen andere Bezeichnungen für die jeweilige Gegend angegeben werden als bei der Gesamtzählung. Und anstatt das händisch zu korrigieren, sollte doch SQL in der Lage sein, dass automatisch zu machen über eine Übersetzungstabelle, oder ?

    Aber vermutlich wird das auf eine PL/SQL Prozedur hinauslaufen bei der bei jedem Dateneingang oder einmal täglich die Bezeichnungen der Gegendein einmal vereinheitlicht werden.
     
  8. Dukel

    Dukel Datenbank-Guru

    Das macht man beim Insert. Dort werden die korrekten Bezeichnungen eingegeben.
     
  9. Patanegra77

    Patanegra77 Benutzer

    Aber in den Rohdaten steht ja die "falsche" Bezeichnung. Wie würde denn eine Insert Anweisung aussehen, bei der man anhand der Übersetzungstabelle die korrekte Bezeichung in eine Einzelzählungstabelle einfügt?
     
  10. Dukel

    Dukel Datenbank-Guru

    Wer trägt denn die falschen Bezeichnungen in die Rohdaten ein? Wie ist denn der Workflow wann was wo eingetragen wird?
     
  11. ukulele

    ukulele Datenbank-Guru

    Erstmal alle Zählungen in eine Tabelle, die Ausgabe bevorzugt nicht als PIVOT wie in deinem Beispiel, das ist dann nämlich die nächste Baustelle die nicht skaliert. Was ist mit den Anzahl-Spalten, gibts da auch mehr als zwei? Dann normalisieren, das hilft mehr als alles Andere.

    Die Bezeichnung könnte fast schon egal sein wenn wir davon ausgehen das alle Teilzählungen in Summe der Gesamtzählung am selben Datum entsprechen müssen. Stimmt die Summe nicht fehlt entweder eine Teilzählung oder die Summe ist falsch.
     
  12. Patanegra77

    Patanegra77 Benutzer

    Also letztend Endes werden die Daten über eine API von einem Server automatisch in die Datenbank geschrieben.
    Die Gesamtzählung ist nicht die Summe aller Teilzählungen, sondern es gibt einen Zähler, der quasi aus der Luft alle Gegenden zählt und dann gibt es in jeder Gegend unten einen Zähler, der nur in der Gegend zählt.
    Am Ende kann es sein, dass zB Anzahl A bei der Teilzählung einen anderen Wert hat bei der Gesamtzählung und diese Differenz soll aus einer View auswertbar sein.
    Auch kann es sein, dass in der Teilzählung noch weitere Details gezählt werden (Anzahl C, Anzahl D), die in der Gesamtzählung garnicht vorkommen. Am Ende soll aber eine weitere auswertbare View entstehen, die mit bestimmten Daten aus der Gesamtzählung und anderen Daten aus den Teilzählungen gefüttert.

    Und mein Problem liegt tatsächlich nur darin, dass ich es nicht hinkriege eine View zu erstellen, bei der zB Anzahl A aus der Gesamtzählung kommt und Anzahl B aus der Teilzählung, wobei eben aufgrund der Übersetzungstabelle erkannt werden soll, dass GegendA in der Gesamtzählung das gleiche ist wie "mein_Ort" in der Teilzählung und somit zusammengefügt werden kann in der View mit dem passenden Datum.
     
  13. Dukel

    Dukel Datenbank-Guru

    Wenn die Daten von einem Server automatisch eingetragen werden dann sollen diese mit den korrekten Bezeichnungen eingetragen werden und du kannst alles in eine Tabelle schreiben.
    Ob es ein "insert into Gegend_a" und ein "insert into Gegend_b" ist oder ein "insert into Zaehlung ... Gegend_a" und ein "insert into Zaehlung ... Gegend_b" wird sollte ja kein Problem sein.
     
  14. ukulele

    ukulele Datenbank-Guru

    Also wenn es bei deinem Layout bliebe:
    Code:
    SELECT   g.Datum,
         g.Gegend,
         g.AnzahlA AS AnzahlA_Gesamtzaehlung,
         sum(a.AnzahlA) AS AnzahlA_Einzelzaehlung,
         g.AnzahlB AS AnzahlB_Gesamtzaehlung,
         sum(b.AnzahlB) AS AnzahlB_Einzelzaehlung
    FROM   Gesamtzaehlung_Luft g
    LEFT JOIN Einzelzaehlung_GegendA a
    ON     g.Datum = a.Datum
    LEFT JOIN Einzelzaehlung_GegendB b
    ON     g.Datum = b.Datum
    GROUP BY g.Datum,
         g.Gegend,
         g.AnzahlA,
         g.AnzahlB
    ORDER BY g.Datum
    Skaliert nur nicht.
     
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