MSSQL: (Sub) Select-Ergebnis nicht in Zeilen sondern Spalten

MysterioJN

SQL-Guru
Beiträge
158
Hallo zusammen,

Basistabelle:
Artikelnummer
10
13


Zusammengesetzte Tabelle:
ID / Artikelnummer / Grundstoff
1 / 10 / Blumen
2 / 10 / Steine
3 / 10 / Erde
4 / 13 / Erde


Wenn ich jetzt eine Abfrage mache, um mir alle "Grundstoffe" anzeigen zu lassen IM Zusammenhang zur jeweiligen Artikelnummer kommt folgendes Ergebnis:

Artikelnummer / Grundstoff

10 / Blumen
10 / Steine
10 / Erde
13 / Erde

Wenn ich aber je Artikel NUR EINE Datenzeile anzeigen darf (Sprich Gruppieren auf Artikelnummer) führt das natürlich zu keinem Ergebnis, da es in der Unterabfrage mehrere Werte gibt.


Fragestellung:

1. Wie kann ich die Abfrage gestalten, das er mir folgendes variables Spalten-Ergebnis anzeigt:

Artikelnummer / Grundstoff / Grundstoff / Grundstoff
10 / Blumen / Steine / Erde
13 / Erde


2. Wie kann ich die Abfrage gestalten, das er mir folgendes einspaltiges Ergebnis anzeigt:

Artikelnummer / Grundstoff

10 / Blumen, Steine, Erde
13 / Erde



Hoffe ich hab mich verständlich ausgedrückt und das jemand vlt. einen Ansatzweg für mich hat.

Herzliche Grüße und Dank im Voraus

Marco
 
Werbung:
in variable Spalte schwer bis gar nicht, eine Tabelle (und auch ein Resultat) muß definiert sein, einen Typ haben.

Code:
test=*# select * from mysterio ;
nummer | stoff 
--------+--------
  10 | blumen
  10 | steine
  10 | erde
  13 | erde
(4 Zeilen)

test=*# select nummer, string_agg(stoff, ', ') from mysterio group by nummer;
nummer |  string_agg  
--------+----------------------
  13 | erde
  10 | blumen, steine, erde
(2 Zeilen)


Das andere mit viel Mühe und krimineller Energie:

Code:
test=*# select nummer, string_agg(case when r=1 then stoff else '' end, '') as s1, string_agg(case when r=2 then stoff else '' end,'') as s2, string_agg(case when r=3 then stoff else '' end,'') as s3 from (select *, row_number() over (partition by nummer) r from mysterio ) foo group by nummer;
nummer |  s1  |  s2  |  s3 
--------+--------+--------+------
  10 | blumen | steine | erde
  13 | erde  |  |
(2 Zeilen)
 
Hab jetzt mich eine zeitlang damit beschäftigt und verstehe den Aufbau einfach nicht des XML Path.
Bzw. bekomme es nicht umgebaut am Beispiel oben.

Kommen immer so Dinge wie "mehrteiliger Bezeichner" als Fehlermeldung.

Aber dank euch dennoch.
 
Werbung:
Also ich kenne deine Abfrage jetzt nicht, ich tue einfach mal so als hätte ich diese zusammengesetzt Tabelle vorliegen. Das kann man natürlich auch auf einen Join anwenden. (Mit WITH erzeuge ich in dem Fall nur die Tabelle):
Code:
WITH zusammengesetzte_tabelle(ID,Artikelnummer,Grundstoff) AS (
SELECT   1,10,'Blumen' UNION ALL
SELECT   2,10,'Steine' UNION ALL
SELECT   3,10,'Erde' UNION ALL
SELECT   4,13,'Erde'
   )
SELECT   z1.Artikelnummer,
     stuff((   SELECT   ' / ' + z2.Grundstoff
         FROM   zusammengesetzte_tabelle z2
         WHERE   z2.Artikelnummer = z1.Artikelnummer
         ORDER BY z2.Grundstoff
         FOR XML PATH ('')),1,3,'') AS Grundstoffe
FROM   zusammengesetzte_tabelle z1
GROUP BY z1.Artikelnummer
Ich greife zweimal auf die Tabelle zu und nutze gezielt unterschiedliche Aliase. In dem Subselect greife ich damit auf Artikelnummer aus dem äußeren Select zu, da lag vermutlich bisher dein Fehler der Meldung nach.
 
Zurück
Oben