online 1
gast (50)

/ Forum / Datenbanken

DatenbankenDatenbanken

Fragevon TheMaxx vom 10.07.2021, 11:55 Options

Vertikale Werte horizontal abbilden

Hallo an alle,
ich arbeite mit dem SQL-Server 2000 und 2005
Dort habe ich zwei Tabellen die über eine ID miteinander verknüpft sind.
Fürs bessere Verständnis hier als Beispiel:

Tab1:
ID | Name | Flag
--------------------
1 | name1| 1
2 | name2| 1

Tab2:
ID | KomNr | Kommentar
--------------------------------
1 | 1 | a
1 | 2 | b
2 | 1 | aa
2 | 2 | bb
2 | 3 | cc

Jetzt sollen die beiden Tabellen miteinander Verknüpft werden und die Kommentare zu den einzelnen „Name“ hintereinander stehen.
Als Beispiel:
Name | Kom1 | Kom2 | Kom3 | Kom4 | Kom5
-------------------------------------------------------------
name1 | a | b | null | null | null
name2 | aa | bb | cc | null | null

Die große Herausforderung ist leider, dass das ganze über eine View gelöst werden soll!
Die Ausgabe soll max 5 Kommentare unterstützen. Sobald eine fehlt wird „null“ eingetragen.

Leider komme ich an dieser Stelle überhaupt nicht weiter. Wenn ich ein Select dieser Art mache:
SELECT Tab1.spotName,
Tab2_0.Kommentar AS Kom1,
Tab2_1.Kommentar AS Comment2,
Tab2_2.Kommentar AS Comment3,
Tab2_3.Kommentar AS Comment4,
Tab2_4.Kommentar AS Comment5
FROM Tab1 INNER JOIN
Tab2 AS Tab2_0 ON Tab1.spot_ID = Tab2_0.spot_ID INNER JOIN
Tab2 AS Tab2_1 ON Tab1.spot_ID = Tab2_1.spot_ID INNER JOIN
Tab2 AS Tab2_2 ON Tab1.spot_ID = Tab2_2.spot_ID INNER JOIN
Tab2 AS Tab2_3 ON Tab1.spot_ID = Tab2_3.spot_ID INNER JOIN
Tab2 AS Tab2_4 ON Tab1.spot_ID = Tab2_4.spot_ID
WHERE (Tab2_0.KomNr = 1) AND
(Tab2_1.KomNr = 2) AND
(Tab2_2.KomNr = 3) AND
(Tab2_3.KomNr = 4) AND
(Tab2_4.KomNr = 5)


Dann klappt es zwar, aber natürlich nur, wenn auch für jeden „Name“ 5 Kommentare (siehe where- Klausel) vorhanden sind. Da das ganze aber dynamisch ist, scheitere ich hier schon.

Zur Not müsste das ganze halt auch mit Hilfe von temp-Tabellen gelöst werden.

Ich wäre sehr dankbar über jeden Vorschlag oder Lösungsansatz!
Vielen Dank schon mal vorab!


Antwort schreiben

Antwort 1 von RaHi vom 13.07.2021, 08:20 Options

Hallo TheMaxx,

Probiere mal ein "left join" statt eines "inner join"

Gruß Ralf

Antwort 2 von RaHi vom 13.07.2021, 22:40 Options

Hallo TheMaxx,

die effizientere Methode ist eine Art pivot-Methode der Form:
SELECT     
dbo.Tab1.Name, 
MIN(CASE WHEN KomNr = 1 THEN (Kommentar) ELSE NULL END) AS KomNr1, 
MIN(CASE WHEN KomNr = 2 THEN (Kommentar) ELSE NULL END) AS KomNr2, 
MIN(CASE WHEN KomNr = 3 THEN (Kommentar) ELSE NULL END) AS KomNr3, 
MIN(CASE WHEN KomNr = 4 THEN (Kommentar) ELSE NULL END) AS KomNr4, 
MIN(CASE WHEN KomNr = 5 THEN (Kommentar) ELSE NULL END) AS KomNr5
FROM 
     dbo.Tab1 INNER JOIN dbo.Tab2 
ON 
     dbo.Tab1.ID = dbo.Tab2.ID
GROUP BY 
     dbo.Tab1.Name

Du kannst den Code auch schon mit weiteren KomNrxx vorbelegen, falls diese Werte zu erwarten sind. Diese Variante ist meiner Korrektur deines Codes vorzuziehen, vorallem bei größeren Tabellen.

Gruß
Ralf

Antwort 3 von TheMaxx vom 14.07.2021, 08:32 Options

Hallo Ralf,
super!!!
Ich hatte mich gestern noch ein bisschen mit den Joins versucht. Leider nicht sehr erfolgreich.

Aber deine neue Lösung passt perfekt!

Vielen Dank.

Ähnliche Themen

Windows XP-Firewall komfortabler gestalten
LordNoir  28.05.2006 - 3551 Hits - 2 Antworten

Werte aus Berichte in andere Berichte anzeigen
jimmy81  11.01.2008 - 19 Hits - 1 Antwort

Werte kumulieren mit Access Abfrage
fjbuby  26.03.2008 - 224 Hits - 1 Antwort

Kreuztabellen Werte verändern
Foine_AE  17.07.2008 - 35 Hits - 1 Antwort

[Abfrage] Nur Werte mit dem jüngsten Datum anzeigen
hans_99  11.06.2009 - 324 Hits - 6 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026