sql >> Database >  >> RDS >> Sqlserver

SQL Server Samenvoegen GROUP BY

Als u sql server 2005+ gebruikt. Dan kun je dit als volgt doen:

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

BEWERKEN

Omdat je ons de tabelstructuur en de gegevens in de verschillende tabellen niet hebt laten zien. Het was een beetje moeilijk om te weten. Dus ik neem aan dat je tabelstructuur er ongeveer zo uitziet:

CREATE TABLE JobsTagMap
(
    JobID INT,
    TagID INT
)

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

Met deze gegevens:

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

Als u die gegevens krijgt, toont u de JobID kan niet uniek zijn. Misschien heb je een Job tafel ergens waar het uniek is. Als je alleen deze tabel wilt gebruiken die je laat zien, dan moet je zoiets als dit doen:

;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

Dit geeft je dit resultaat:

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

Dus in de toekomst altijd laten zien welke tabelstructuur en het gegevens . Dat geeft je betere antwoorden



  1. JPA RollbackException maar niet in eenheidstest

  2. Een reeks datums genereren

  3. MySQL Trigger - Een SELECT opslaan in een variabele

  4. Hoe de primaire sleutelzaad voor een postgres-tabel te specificeren?