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

SQLServerで複数の行のテキストを単一のテキスト文字列に連結する方法

    SQL Server 2017またはAzureを使用している場合は、MathieuRendaの回答を参照してください。

    1対多の関係で2つのテーブルを結合しようとしたときに、同様の問題が発生しました。 SQL 2005で、XML PATH メソッドは、行の連結を非常に簡単に処理できます。

    STUDENTSというテーブルがある場合

    SubjectID       StudentName
    ----------      -------------
    1               Mary
    1               John
    1               Sam
    2               Alaina
    2               Edward
    

    期待した結果は次のとおりです。

    SubjectID       StudentName
    ----------      -------------
    1               Mary, John, Sam
    2               Alaina, Edward
    

    次のT-SQLを使用しました :

    SELECT Main.SubjectID,
           LEFT(Main.Students,Len(Main.Students)-1) As "Students"
    FROM
        (
            SELECT DISTINCT ST2.SubjectID, 
                (
                    SELECT ST1.StudentName + ',' AS [text()]
                    FROM dbo.Students ST1
                    WHERE ST1.SubjectID = ST2.SubjectID
                    ORDER BY ST1.SubjectID
                    FOR XML PATH ('')
                ) [Students]
            FROM dbo.Students ST2
        ) [Main]
    

    最初にコンマを連結してsubstringを使用できれば、同じことをよりコンパクトな方法で行うことができます。 最初のものをスキップして、サブクエリを実行する必要がないようにします:

    SELECT DISTINCT ST2.SubjectID, 
        SUBSTRING(
            (
                SELECT ','+ST1.StudentName  AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH ('')
            ), 2, 1000) [Students]
    FROM dbo.Students ST2
    


    1. Neo4j-Cypherを使用して制約を削除する

    2. SQLで年ごとにグループ化する方法

    3. MySQLGROUPBYの動作

    4. Windows用のPostgreSQLの開発、パート1