Merge multiple rows into a single row

sql-server, sql-server-2008

Solution

Here's A way to do it (also works with 2005):

Table

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )

Data

INSERT  INTO @table
        SELECT  127,
                '090820006311404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '090820006311404926326C',
                'Ericsson'
        UNION ALL
        SELECT  127,
                '111012237401404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Alcatel'

Query

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ',' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]

Result

Type_ID     Client_ID               PBX_Vendor
127         090820006311404926326C  Aastra,Ericsson
127         111012237401404926326C  Aastra
127         120209287521404926326C  Aastra,Alcatel

Problem

I would like to know the best approach to merge data from the following rows into a single row in another view. These are the results as they are currently displayed; ``` Type_ID | Client_ID | PBX_Vendor | 127 | 090820006311404926326C | Aastra | 127 | 090820006311404926326C | Ericsson | 127 | 111012237401404926326C | Aastra | 127 | 120209287521404926326C | Aastra | 127 | 120209287521404926326C | Alcatel | ``` The following is how I would like to see the data; ``` Type_ID | Client_ID | PBX_Vendor | 127 | 090820006311404926326C | Aastra, Ericsson | 127 | 111012237401404926326C | Aastra | 127 | 120209287521404926326C | Aastra, Alcatel | ``` Basically, there are multiple PBX Vendors associated with a Client ID. I need this display in a single row for a helpdesk system. I have attempted this already with CONCAT, but all I end up with is a single row with over 100 vendors in it that are not specific to a Client_ID. Any help with be very much appreciated!

Original source