486 Stimmen

Wie verwendet man GROUP BY zum Verketten von Zeichenfolgen in SQL Server?

Wie bekomme ich:

id       Name       Value
1          A          4
1          B          8
2          C          9

zu

id          Column
1          A:4, B:8
2          C:9

20voto

Shem Sargent Punkte 151

Acht Jahre später... Microsoft SQL Server vNext Database Engine hat endlich Transact-SQL erweitert, um gruppierte Stringverkettung direkt zu unterstützen. Die Community Technical Preview Version 1.0 fügte die STRING_AGG Funktion hinzu und CTP 1.1 fügte die WITHIN GROUP Klausel für die STRING_AGG Funktion hinzu.

Referenz: https://msdn.microsoft.com/en-us/library/mt775028.aspx

16voto

Installieren Sie die SQLCLR-Aggregate von http://groupconcat.codeplex.com

Dann können Sie einen Code wie diesen schreiben, um das gewünschte Ergebnis zu erhalten:

CREATE TABLE foo
(
 id INT,
 name CHAR(1),
 Value CHAR(1)
);

INSERT  INTO dbo.foo
    (id, name, Value)
VALUES  (1, 'A', '4'),
        (1, 'B', '8'),
        (2, 'C', '9');

SELECT  id,
    dbo.GROUP_CONCAT(name + ':' + Value) AS [Column]
FROM    dbo.foo
GROUP BY id;

13voto

Joel Coehoorn Punkte 377088

SQL Server 2005 und spätere Versionen ermöglichen es Ihnen, Ihre eigenen benutzerdefinierte Aggregatfunktionen auch für Dinge wie Verkettung - siehe das Beispiel am Ende des verlinkten Artikels.

9voto

Phillip Punkte 229

Dies ist nur eine Ergänzung zu Kevin Fairchilds Beitrag (übrigens sehr clever). Ich hätte es als Kommentar hinzugefügt, aber ich habe noch nicht genug Punkte :)

Ich habe diese Idee für eine Ansicht verwendet, an der ich gerade arbeitete, aber die Elemente, die ich verknüpfte, enthielten Leerzeichen. Also habe ich den Code leicht geändert, um keine Leerzeichen als Begrenzer zu verwenden.

Nochmals vielen Dank für den coolen Workaround Kevin!

CREATE TABLE #YourTable ( [ID] INT, [Name] CHAR(1), [Value] INT ) 

INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (1, 'A', 4) 
INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (1, 'B', 8) 
INSERT INTO #YourTable ([ID], [Name], [Value]) VALUES (2, 'C', 9) 

SELECT [ID], 
       REPLACE(REPLACE(REPLACE(
                          (SELECT [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) as A 
                           FROM   #YourTable 
                           WHERE  ( ID = Results.ID ) 
                           FOR XML PATH (''))
                        , '</A><A>', ', ')
                ,'<A>','')
        ,'</A>','') AS NameValues 
FROM   #YourTable Results 
GROUP  BY ID 

DROP TABLE #YourTable

8voto

Michal B. Punkte 5604

Ein Beispiel wäre

In Oracle können Sie die Aggregatfunktion LISTAGG verwenden.

Original-Aufzeichnungen

name   type
------------
name1  type1
name2  type2
name2  type3

Sql

SELECT name, LISTAGG(type, '; ') WITHIN GROUP(ORDER BY name)
FROM table
GROUP BY name

Ergebnis in

name   type
------------
name1  type1
name2  type2; type3

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