sql >> データベース >  >> RDS >> Sqlserver

CTEを使用して列の値を文字列に連結することは可能ですか?

    私はこれをお勧めしませんが、なんとかうまくいきました。

    表:

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

    データ:

    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')
    

    クエリ:

    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 
    

    要求に応じて、XMLメソッドは次のとおりです。

    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
    


    1. mysqldumpを使用して単一のMySQLテーブルを復元する方法は?

    2. 暗号化された接続SQLServerの証明書の展開

    3. SQL:グループごとの最大レコードを検索します

    4. MySQL:MySQLルートパスワードをリセットまたは変更するにはどうすればよいですか?