sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server Concatenar GRUPO POR

Si está utilizando el servidor sql 2005+. Entonces puedes hacer esto:

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

EDITAR

Porque no nos mostraste la estructura de la tabla y los datos en las diferentes tablas. Fue un poco difícil de saber. Así que asumo que la estructura de su tabla se parece a esto:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

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

Con estos datos:

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 está obteniendo esos datos que está mostrando el JobID no puede ser único. Es posible que tenga un Job mesa en algún lugar donde sea único. Si solo desea usar esta tabla que está mostrando, debe hacer algo como esto:

;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

Esto le dará este resultado:

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

Entonces, en el futuro, siempre muestre qué estructura de tabla y datos . Eso te dará mejores respuestas