sql >> Databáze >  >> RDS >> Sqlserver

Jak zřetězit text z více řádků do jednoho textového řetězce na serveru SQL Server

Pokud používáte SQL Server 2017 nebo Azure, přečtěte si odpověď Mathieu Renda.

Měl jsem podobný problém, když jsem se pokoušel spojit dvě tabulky se vztahy one-to-many. V SQL 2005 jsem našel, že XML PATH metoda dokáže velmi snadno zvládnout zřetězení řádků.

Pokud existuje tabulka s názvem STUDENTS

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

Výsledek, který jsem očekával, byl:

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

Použil jsem následující 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]

Totéž můžete udělat kompaktnějším způsobem, pokud můžete spojit čárky na začátku a použít substring přeskočit první, takže nemusíte provádět dílčí dotaz:

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. Sloupec je ve výběrovém seznamu neplatný, protože není obsažen v agregační funkci ani v klauzuli GROUP BY

  2. Zobrazení seznamu PostgreSQL

  3. ZKONTROLUJTE Omezení na serveru SQL Server

  4. Jak vygeneruji náhodné číslo pro každý řádek ve výběru T-SQL?