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
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
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
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;
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.
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
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 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.