# [MS SQL] Mehrere Spaltenwerte in eine Spalte zusammenfassen



## PapaRusski (6. Mai 2013)

Guten Tag zusammen ich hab folgendes Problem und steh schon seit längerem aufm Schlauch.

Ich habe das Problem:
Durch eine Select abfrage bekomme ich diese Ergebniss

Produktnummer //  Attribute // Wert
1000                  //  Farbe     // Blau
1000                  // Farbe      // Gelb
1000                 //  Farbe      // Rot
1001                 //  Eigenschaften // Schwer
1001                 // Eigenschaften // Carbon
1002                 // Eigenschaften // Schwer


sowas z.b. jetzt will ich daraus dies bekommen

1000 // Farbe // Blaue ; Gelb ; Rot
1001 // Eigenschaften // Schwer, Carbon
1002 // Eigenschaften // Schwer 


Könntet ihr mir da paar Stichwörter sagen wie ich sowas realisieren kann?

Danke.


----------



## Yaslaw (6. Mai 2013)

Was für eine DB ist es? Mit MySQL ist das einfach über GROUP_CONCAT() zu lösen

```
SELECT
    produktnummer,
    attribute,
    GROUP_CONCAT(','. wert)
FROM
    my_table
GROUP BY
    produktnummer,
    attribute
```

Bei Oracle ists nicht so einfach


----------



## PapaRusski (6. Mai 2013)

Danke für die schnelle Antwort, also ich arbeite mit dem Mircosoft SQL Server Management Studio, und es ist ein Mircosoft SQL Server 2008.


----------



## Yaslaw (6. Mai 2013)

CROSS APPLY ?
Dennmit Googeln nach 'mssql group_concat' fand ich den folgenden Link
http://stackoverflow.com/questions/...t-mysql-function-in-microsoft-sql-server-2005

Testen musst du selber. Hab noch nie mit MS SQL gearbeitet

Nachtrag: Hab den Titel noch um die DBMS ergänzt


----------



## Thomas Darimont (9. Mai 2013)

Hallo,

hier ein Beispiel für SQL Server (getestet unter SQL Server 2012 jedoch sollte das so auch in SQL Server 2008 Funktionieren)

Wie so oft bei solchen textuellen "Zeilenwerte-zu-Spaltenwerte" Operationen kann man sich hier der XML Funktionen der jeweiligen Datenbanken bedienen. Das ist zwar sicherlich nicht die effizienteste Methode aber für "kleinere" Datenmengen sollte der Overhead der XML Funktionen zu vernachlässigen sein. Hierzu sollte man Performance Messungen durchführen und ggf. eine andere Implementierung verwenden.


```
with
input as (
	select 1000 as prod , 'Farbe' as attr, 'Blau' as value
	union all
	select 1000 as prod , 'Farbe' as attr,  'Gelb'  as value
	union all
	select 1000 as prod , 'Farbe' as attr, 'Rot'  as value
	union all
	select 1001 as prod , 'Eigenschaften' as attr, 'Schwer' as value 
	union all
	select 1001 as prod , 'Eigenschaften' as attr, 'Carbon' as value 
	union all
	select 1002 as prod , 'Eigenschaften' as attr,'Schwer' as value 
)
select 
   input.prod
 , stuff((select ', ' + i.value from input i where i.prod = input.prod and i.attr = 'Eigenschaften' for xml path('')),1 ,1 ,'') as Eigenschaften
 , stuff((select ', ' + i.value from input i where i.prod = input.prod and i.attr = 'Farbe' for xml path('')),1 ,1 ,'') as Farbe
from input
group by input.prod
```

Ausgabe:

```
prod	Eigenschaften	Farbe
1000	NULL            Blau, Gelb, Rot
1001	Schwer, Carbon  NULL
1002	Schwer	        NULL
```

Gruß Tom


----------

