Fehlende Daten nach PIVOT

dbfbka

Neuer Benutzer
Beiträge
3
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
 
Werbung:
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
 
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.
 
Werbung:
Zurück
Oben