Is it possible to concatenate column values into a string using CTE?

前端 未结 3 1145
野的像风
野的像风 2020-12-18 07:46

Say I have the following table:

id|myId|Name
-------------
1 | 3  |Bob 
2 | 3  |Chet
3 | 3  |Dave
4 | 4  |Jim
5 | 4  |Jose
-------------

Is

3条回答
  •  刺人心
    刺人心 (楼主)
    2020-12-18 08:10

    I do not recommend this, but I managed to work it out.

    Table:

    CREATE TABLE [dbo].[names](
        [id] [int] NULL,
        [myId] [int] NULL,
        [name] [char](25) NULL
    ) ON [PRIMARY]
    

    Data:

    INSERT INTO names values (1,3,'Bob')
    INSERT INTO names values 2,3,'Chet')
    INSERT INTO names values 3,3,'Dave')
    INSERT INTO names values 4,4,'Jim')
    INSERT INTO names values 5,4,'Jose')
    INSERT INTO names values 6,5,'Nick')
    

    Query:

    WITH CTE (id, myId, Name, NameCount)
         AS (SELECT id,
                    myId,
                    Cast(Name AS VARCHAR(225)) Name,
                    1                          NameCount
             FROM   (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                            myId,
                            Name
                     FROM   names) e
             WHERE  id = 1
             UNION ALL
             SELECT e1.id,
                    e1.myId,
                    Cast(Rtrim(CTE.Name) + ',' + e1.Name AS VARCHAR(225)) AS Name,
                    CTE.NameCount + 1                                     NameCount
             FROM   CTE
                    INNER JOIN (SELECT Row_number() OVER (PARTITION BY myId ORDER BY myId) AS id,
                                       myId,
                                       Name
                                FROM   names) e1
                      ON e1.id = CTE.id + 1
                         AND e1.myId = CTE.myId)
    SELECT myID,
           Name
    FROM   (SELECT myID,
                   Name,
                   (Row_number() OVER (PARTITION BY myId ORDER BY namecount DESC)) AS id
            FROM   CTE) AS p
    WHERE  id = 1 
    

    As requested, here is the XML method:

    SELECT myId,
           STUFF((SELECT ',' + rtrim(convert(char(50),Name))
            FROM   namestable b
            WHERE  a.myId = b.myId
            FOR XML PATH('')),1,1,'') Names
    FROM   namestable a
    GROUP BY myId
    

提交回复
热议问题