Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment concaténer du texte de plusieurs lignes en une seule chaîne de texte dans SQL Server

Si vous êtes sur SQL Server 2017 ou Azure, voir la réponse de Mathieu Renda.

J'ai eu un problème similaire lorsque j'essayais de joindre deux tables avec des relations un-à-plusieurs. Dans SQL 2005, j'ai trouvé que XML PATH peut gérer la concaténation des lignes très facilement.

S'il existe une table appelée STUDENTS

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

Le résultat que j'attendais était :

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

J'ai utilisé le T-SQL suivant :

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]

Vous pouvez faire la même chose de manière plus compacte si vous pouvez concaténer les virgules au début et utiliser substring pour ignorer la première afin de ne pas avoir à faire une sous-requête :

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