sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Sammanfoga GROUP BY

Om du använder sql server 2005+. Då kan du göra så här:

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

REDIGERA

Eftersom du inte visade oss tabellstrukturen och data i de olika tabellerna. Det var lite svårt att veta. Så jag antar att din tabellstruktur ser ut ungefär så här:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

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

Med dessa data:

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

Om du får den informationen visar du JobID kan inte vara unikt. Du kanske har ett Job bord någonstans där det är unikt. Om du bara vill använda dessa tabeller som du visar måste du göra något så här:

;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

Detta ger dig det här resultatet:

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

Så i framtiden visa alltid vilken tabellstruktur och det data . Det ger dig bättre svar



  1. Lägg snabbt till en kopia av en kolumn i en MySQL-tabell

  2. Deklarera variabel i Bash?

  3. Hur man känner till en tidszon för en tidsstämpel i postgresql 8.3

  4. ställa in flera kolumner med en uppdatering