Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Verkettung GROUP BY

Wenn Sie SQL Server 2005+ verwenden. Dann können Sie so vorgehen:

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

BEARBEITEN

Weil Sie uns die Tabellenstruktur und die Daten in den verschiedenen Tabellen nicht gezeigt haben. Es war ein bisschen schwer zu wissen. Ich gehe also davon aus, dass Ihre Tabellenstruktur in etwa so aussieht:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

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

Mit diesen Daten:

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')

Wenn Sie diese Daten erhalten, zeigen Sie die JobID an kann nicht einzigartig sein. Möglicherweise haben Sie einen Job Tisch irgendwo, wo es einzigartig ist. Wenn Sie nur diese angezeigte Tabelle verwenden möchten, müssen Sie Folgendes tun:

;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

Dadurch erhalten Sie dieses Ergebnis:

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

Also in Zukunft immer welche Tabellenstruktur anzeigen und es Daten . So erhalten Sie bessere Antworten