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

Concaténer SQL Server GROUP BY

Si vous utilisez sql server 2005+. Ensuite, vous pouvez faire comme ceci :

SELECT 
    JobsTagMap.JobID,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
            WHERE
                Tags.TagID=JobsTagMap.TagID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM JobsTagMap

MODIFIER

Parce que vous ne nous avez pas montré la structure des tables et les données des différentes tables. C'était un peu difficile à savoir. Je suppose donc que la structure de votre table ressemble à ceci :

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

CREATE TABLE Tags
(
    TagID INT,
    Title VARCHAR(100)
)

Avec ces données :

INSERT INTO JobsTagMap
VALUES(1,1),(1,2),(2,2),(2,4),(2,5)

INSERT INTO Tags
VALUES(1,'Tag1'),(2,'Tag2'),(3,'Tag2'),(4,'Tag5'),(5,'Tag9')

Si vous obtenez ces données, vous affichez le JobID ne peut pas être unique. Vous pourriez avoir un Job table quelque part où elle est unique. Si vous souhaitez simplement utiliser le tableau que vous montrez, vous devez faire quelque chose comme ceci :

;WITH CTE
AS
(
    SELECT
        ROW_NUMBER() OVER(PARTITION BY JobID ORDER BY JobID) AS RowNbr,
        JobsTagMap.*
    FROM
        JobsTagMap
)
SELECT
    *,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
                JOIN JobsTagMap
                    ON Tags.TagID=JobsTagMap.TagID
            WHERE
                JobsTagMap.JobID=CTE.JobID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM
    CTE
WHERE
    CTE.RowNbr=1

Cela vous donnera ce résultat :

1   1   1   Tag1,Tag2
1   2   2   Tag2,Tag5,Tag9

Donc, à l'avenir, montrez toujours quelle structure de table et ses données . Cela vous donnera de meilleures réponses