2 Stimmen

T-SQL String Verkettung mehrerer Zeilen

Mögliche Duplikate:
Simulation der MySQL-Funktion group_concat in MS SQL Server 2005?
Verkettung von Werten auf Basis der ID

Ich versuche, eine SQL-Abfrage in SSMS 2008 zu schreiben, um nach einer einzelnen Spalte zu gruppieren. Ich habe eine Tabelle mit nur zwei Spalten: Teilenummer und Produktcode. Beide Spalten sind VARCHAR-Datentypen.

Im Moment sieht meine Tabelle ungefähr so aus:

Part Number              Product Code
111222                   AAAAA
111222                   BBBBB
111222                   CCCCC
111223                   AAAAA
111224                   AAAAA
111225                   AAAAA
111226                   DDDDD
111226                   EEEEE

Ich möchte aber, dass diese Tabelle stattdessen wie folgt aussieht:

111222                   AAAAA, BBBBB, CCCCC                 
111223                   AAAAA
111224                   AAAAA
111225                   AAAAA
111226                   DDDDD, EEEEE                   

Wie kann ich das tun? Ich habe gelesen, einige Websites empfehlen coalesce Funktion, aber ich kann nicht scheinen, um herauszufinden, einen Weg, um diese richtig zu arbeiten.

11voto

Code Magician Punkte 22181

Mehrere Ansätze hier http://web.archive.org/web/20120429052520/http://www.projectdmx.com/tsql/rowconcatenate.aspx

Der Artikel beschreibt viel zu viele Ansätze, um sie in dieser Antwort aufzulisten, aber mein Lieblingsansatz ist dieser:

Die Blackbox-XML-Methoden

Ein Beispiel für die String-Verkettung unter Verwendung der FOR XML-Klausel mit PATH Modus wird im Folgenden beschrieben. Es wurde ursprünglich von Eugene Kogan veröffentlicht und später wurde es in öffentlichen Newsgroups verbreitet.

SELECT p1.CategoryId,
      ( SELECT ProductName + ',' 
          FROM Northwind.dbo.Products p2
         WHERE p2.CategoryId = p1.CategoryId
         ORDER BY ProductName
           FOR XML PATH('') ) AS Products
  FROM Northwind.dbo.Products p1
 GROUP BY CategoryId ;

Auch hier wurde der ähnliche Ansatz ursprünglich in den Beta-Newsgroups gefunden, unter Verwendung des Operators CROSS APPLY.

SELECT DISTINCT CategoryId, ProductNames
  FROM Products p1
 CROSS APPLY ( SELECT ProductName + ',' 
                 FROM Products p2
                WHERE p2.CategoryId = p1.CategoryId 
                ORDER BY ProductName 
                  FOR XML PATH('') )  D ( ProductNames ) 

Vielleicht fällt Ihnen ein Komma am Ende der verketteten Zeichenfolge auf, das Sie mit einer STUFF-, SUBSTRING- oder LEFT-Funktion entfernen können. Während die oben genannten Methoden zum Zeitpunkt der Erstellung dieses Artikels von vielen als zuverlässig angesehen werden, gibt es gibt es keine Garantie, dass dies so bleibt, da die interne Funktionsweise und Auswertungsregeln des Ausdrucks FOR XML PATH() in korrelierten Unterabfragen nicht gut dokumentiert sind.

1voto

Chains Punkte 12031

Sie könnten dies tun:

DECLARE @ProductCodeCSV as varchar(max)

select @ProductCodeCSV = COALESCE(@ProductCodeCSV + ', ', '') + [product_code]
from table
where part_ = 34175--@ID

select @ProductCodeCSV

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X