SQL-Abfrage - Werte aus mehreren Spalten in einer Zeile

knilix

Neuer Benutzer
Beiträge
4
Hallo Zusammen,

ich bin leider ziemlicher DB-Anfänger und stehe gerade etwas auf dem Schlauch. Vielleicht kann mir hier jemand einen Tipp geben.

Meine aktuelle Abfrage sieht so aus:

SELCT Tabelle1.Nummer, Tabelle1.Name, Tabelle2.Nummer, Tabell2.Gruppe

FROM [Datenbank].[dbo].[Tabelle1], [Datenbank].[dbo].[Tabelle2]

WHERE Tabelle1.Nummer = Tabelle2.Nummer

ORDER BY Tabelle1.Name


Mit folgendem Ergebniss:

Nummer | Name | Nummer | Gruppe
4 | ABC | 4 | AAA
4 | ABC | 4 | BBB
5 | ABC | 5 | AAA
5 | ABC | 5 | BBB
6 | ABC | 6 | AAA
6 | ABC | 6 | BBB
6 | ABC | 6 | CCC

usw.

Ich würde nun gern die Ausgabe so modifizieren, dass mein Ergebniss so aussieht:

Nummer | Name | Nummer | GruppeValue1 | GruppeValue2 | GruppeValue3
4 | ABC | 4 | AAA | BBB
5 | ABC | 5 | AAA | BBB
6 | ABC | 6 | AAA | BBB | CCC

Kann mir jemand sagen ob und wie das möglich ist? Die Value Werte können dabei bis zur Zahl 32 ansteigen.

Ich hoffe mein Beispiel ist soweit verständlich. Wäre über jeden Hinweis Dankbar.

Viele Grüße
 
Werbung:
Hallo akretschmer,

vielen Dank für deinen Hinweis. Kannst du mir bitte sagen wo ich die FAQs hier finden? Unter Hinweise finde ich nur Infos zur allgemeinen Benutzung des Forum. :(
 
Ich verstehe nur Bahnhof :(

Versuche die Abfrage auf einem MS SQL Server laufen zu lassen. Dein Post zeigt auf ein PostgreSQL Forum wenn ich das richtig verstehe.
 
Ja, etwas Kreativität setze ich halt voraus, daß an Deine DB anzupassen.

Code:
test=*# select * from knillix ;
 nummer | name | gruppe
--------+------+--------
      4 | abc  | aaa
      4 | abc  | bbb
      5 | abc  | aaa
      5 | abc  | bbb
      6 | abc  | aaa
      6 | abc  | bbb
      6 | abc  | ccc
(7 rows)

test=*# select nummer, name, nummer, string_agg(case when gruppe = 'aaa' then gruppe else null end,'') as gruppe1, string_agg(case when gruppe = 'bbb' then gruppe else null end,'') as gruppe2, string_agg(case when gruppe = 'ccc' then gruppe else null end,'') as gruppe3 from knillix group by nummer, name, nummer;
 nummer | name | nummer | gruppe1 | gruppe2 | gruppe3
--------+------+--------+---------+---------+---------
      4 | abc  |      4 | aaa     | bbb     |
      5 | abc  |      5 | aaa     | bbb     |
      6 | abc  |      6 | aaa     | bbb     | ccc
(3 rows)

test=*#
 
Grundsätzlich gibt es mehrere Wege das zu erreichen, entscheidend ist dabei auf jedenfall die Frage wieviele Informationen hier gejoint werden, eventuell geht es mit PIVOT oder ähnlichen Mitteln besser. Eine einfache Lösung für 3 Informationsspalten wäre:
Code:
SELCT Tabelle1.Nummer, Tabelle1.Name, t1.Gruppe AS GruppeValue1, t2.Gruppe AS GruppeValue2, t3.Gruppe AS GruppeValue3
FROM [Datenbank].[dbo].[Tabelle1]
LEFT JOIN [Datenbank].[dbo].[Tabelle2] t1
ON Tabelle1.Nummer = t1.Nummer
LEFT JOIN [Datenbank].[dbo].[Tabelle2] t2
ON Tabelle1.Nummer = t2.Nummer
LEFT JOIN [Datenbank].[dbo].[Tabelle2] t3
ON Tabelle1.Nummer = t3.Nummer
ORDER BY Tabelle1.Name
 
Ja, etwas Kreativität setze ich halt voraus, daß an Deine DB anzupassen.

Code:
test=*# select * from knillix ;
 nummer | name | gruppe
--------+------+--------
      4 | abc  | aaa
      4 | abc  | bbb
      5 | abc  | aaa
      5 | abc  | bbb
      6 | abc  | aaa
      6 | abc  | bbb
      6 | abc  | ccc
(7 rows)

test=*# select nummer, name, nummer, string_agg(case when gruppe = 'aaa' then gruppe else null end,'') as gruppe1, string_agg(case when gruppe = 'bbb' then gruppe else null end,'') as gruppe2, string_agg(case when gruppe = 'ccc' then gruppe else null end,'') as gruppe3 from knillix group by nummer, name, nummer;
 nummer | name | nummer | gruppe1 | gruppe2 | gruppe3
--------+------+--------+---------+---------+---------
      4 | abc  |      4 | aaa     | bbb     |
      5 | abc  |      5 | aaa     | bbb     |
      6 | abc  |      6 | aaa     | bbb     | ccc
(3 rows)

test=*#

Vielen Dank akretschmer - Ich musste erst eine aktuelle Version vom SQL Server installieren, dann ging auch die Funktion string_agg.

fetzt :)
 
Werbung:
Zurück
Oben