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

Fehlende Daten nach PIVOT

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von dbfbka, 26 November 2019.

  1. dbfbka

    dbfbka Neuer Benutzer

    Hallo Forum,

    ich habe folgendes Problem:
    Tabelle 1 = Kunden
    Tabelle 2 = Adressen
    Tabelle 3 = Kontaktdaten (email, Telefon, Handy etc. in einer Spalte)
    Tabelle 4 = Kontaktart (nur IDs)
    Tabelle 5 = Hilfstabelle mit Texten für IDs aus Tabelle 4
    Daran kann ich auch nichts ändern.


    In folgendem Script zeigt er mir alle Daten korrekt an (allerdings mehrere Zeilen wenn bei einer Adresse mehrere Kontaktdaten hinterlegt sind. Wenn keine Kontaktdaten vorhanden, wird in NULL ausgegeben):
    select * from Tabelle1 a
    left join Tabelle3 b on a.addressID = b.addressID

    Daher wollte ich die Daten aus Tabelle3 entsprechend aus einer Spalte in mehrere Spalten aufteilen und nur gewisse Spalten ausgeben:

    select *, [Telefon], [Mobil], [Telefax], [e-Mail]
    from
    (
    Select
    a.Kundennummer,
    a.addressID,
    b.Vorname,
    b.Nachname,
    e.Text,
    c.Kontaktdaten
    from Tabelle1 a
    inner join Tabelle2 b
    on a.addressID = b.addressID
    left join Tabelle3 c
    on a.addressID = c.addressID
    inner join Tabelle4 d
    on c.KontaktartID = d.KontaktartID
    inner join Tabelle5 e
    on e.ID = d.ID

    ) d
    pivot
    (
    max(Kontaktdaten)
    for text in ([Telefon], [Mobil], [Telefax], [e-Mail])
    ) piv;

    Mein Problem ist nun, dass er mir die Kunden, die keine Kontaktdaten hinterlegt haben, auch nicht anzeigt und nicht wie in diesem Script:
    select * from Tabelle1 a
    left join Tabelle3 b on a.addressID = b.addressID
    die entsprechenden Felder mit NULL ausgibt.

    Ich hoffe das ist verständlich und einer von euch kann mir helfen.

    Danke & Gruß
    DBFBKA
     
  2. dbfbka

    dbfbka Neuer Benutzer

    Nach etlichen Stunden try&error habe ich die Lösung gefunden. Weiß aber nicht warum es zu dem Problem kam und warum Tabelle5 schuld war.

    Hier das Ergebnis:
    select *, [1] as Telefon, [2] as Mobil, [3] as Fax, [4] as Email
    from
    (
    Select
    a.Kundennummer,
    a.addressID,
    b.Vorname,
    b.Nachname,
    d.KontaktartID
    c.Kontaktdaten
    from Tabelle1 a
    inner join Tabelle2 b
    on a.addressID = b.addressID
    left join Tabelle3 c
    on a.addressID = c.addressID
    inner join Tabelle4 d
    on c.KontaktartID = d.KontaktartID
    --inner join Tabelle5 e
    --on e.ID = d.ID

    ) d
    pivot
    (
    max(Kontaktdaten)
    for KontaktArtID in ([1], [2], [3], [4])
    ) piv;

    So hat es auf jeden Fall geklappt. Warum auch immer :-D
     
  3. ukulele

    ukulele Datenbank-Guru

    Du machst bei Tabelle5 einen INNER JOIN. Das bedeutet es muss ein Datensatz in Tabelle5 existieren der sich zuordnen läßt ansonsten wird der Datensatz nicht ausgegeben. Da sich der Join auf Tabelle4 bezieht, diese sich auf Tabelle3 bezieht etc. müssen da überall sinnvolle Daten drin stehen oder es wird nichts ausgegeben. Teste es mal mit LEFT JOIN auch bei Tabelle5, das sollte erstmal schnelle Abhilfe schaffen.

    Das Tabellendesign ist ansich richtig, natürlich etwas komplexer zu handhaben. Du könntest aber in diesem Design zu einem Kunden mehr als eine E-Mail Adresse ablegen, was erstmal gut ist. In deiner Ausgabe würde sich der Kunde dann aber auch wieder mehrfach wieder finden, daher solltest du vielleicht prüfen ob das vor kommt.
     
  4. dbfbka

    dbfbka Neuer Benutzer

    Danke für den Tip!
     
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