Search code examples
sqlsql-serverstring-concatenationsql-server-group-concat

How to use GROUP BY to concatenate strings in SQL Server?


How do I get:

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

to

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

Solution

  • No CURSOR, WHILE loop, or User-Defined Function needed.

    Just need to be creative with FOR XML and PATH.

    [Note: This solution only works on SQL 2005 and later. Original question didn't specify the version in use.]

    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],
      STUFF((
        SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) 
        FROM #YourTable 
        WHERE (ID = Results.ID) 
        FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
      ,1,2,'') AS NameValues
    FROM #YourTable Results
    GROUP BY ID
    
    DROP TABLE #YourTable