Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server Concatenar GROUP BY


Se você estiver usando o sql server 2005+. Então você pode fazer assim:
SELECT 
    JobsTagMap.JobID,
    STUFF
    (
        (
            SELECT 
                ',' +Title
            FROM
                Tags
            WHERE
                Tags.TagID=JobsTagMap.TagID
            FOR XML PATH('')
        )
    ,1,1,'') AS Title
FROM JobsTagMap

EDITAR

Porque você não nos mostrou a estrutura da tabela e os dados nas diferentes tabelas. Foi um pouco difícil saber. Então, suponho que sua estrutura de tabela seja algo assim:
CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

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

Com esses dados:
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')

Se você está obtendo esses dados, está mostrando o JobID não pode ser único. Você pode ter um Job tabela em algum lugar onde seja único. Se você quiser apenas usar essas tabelas que você está mostrando, você precisa fazer algo assim:
;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

Isso lhe dará este resultado:
1   1   1   Tag1,Tag2
1   2   2   Tag2,Tag5,Tag9

Então, no futuro, sempre mostre qual estrutura de tabela e dados . Isso lhe dará melhores respostas