Search code examples
sql-serversql-server-2005for-xml

Row concat from this query


I have this query:

SELECT DISTINCT IM.EDIFICIOS_ID, TI.TITULAR
FROM IMPORTACION IM
INNER JOIN I_EDIFICIO IE ON IM.IMPORTACION_ID=IE.IMPORTACION_ID
INNER JOIN I_EDIFICIO_TITULAR ET ON IM.IMPORTACION_ID=ET.IMPORTACION_ID AND IE.EDIFICIO_ID=ET.EDIFICIO_ID
INNER JOIN I_TITULAR TI ON IM.IMPORTACION_ID=TI.IMPORTACION_ID AND ET.TITULAR_ID=TI.TITULAR_ID
WHERE TI.TITULAR IS NOT NULL AND TI.TITULAR<>''
ORDER BY IM.EDIFICIOS_ID, TI.TITULAR;

that returns this result set:

EDIFICIOS_ID TITULAR
------------ ------------------
1911         Ana María García
1911         Anselmo Piedrahita
1911         Manuel López
2594         Carlos Pérez
2594         Felisa García
6865         Carlos Pérez
6865         Felisa García
8428         Carlos Pérez

I want to concatenate the values from TITULAR for each EDIFICIOS_ID, so I get this:

EDIFICIOS_ID TITULAR
------------ ------------------
1911         Ana María García; Anselmo Piedrahita; Manuel López
2594         Carlos Pérez; Felisa García
6865         Carlos Pérez; Felisa García
8428         Carlos Pérez

I'm trying to use the FOR XML PATH trick. I've used it in the past but, since I can't really understand how it works, I can't figure out how to apply it to this specific case. Can you provide me with some ideas?


Solution

  • try something like this:

    DECLARE @TableA  table (EDIFICIOS_ID int, TITULAR nvarchar(500))
    INSERT INTO @TableA VALUES (1911 ,'Ana María García')
    INSERT INTO @TableA VALUES (1911 ,'Anselmo Piedrahita')
    INSERT INTO @TableA VALUES (1911 ,'Manuel López')
    INSERT INTO @TableA VALUES (2594 ,'Carlos Pérez')
    INSERT INTO @TableA VALUES (2594 ,'Felisa García')
    INSERT INTO @TableA VALUES (6865 ,'Carlos Pérez')
    INSERT INTO @TableA VALUES (6865 ,'Felisa García')
    INSERT INTO @TableA VALUES (8428 ,'Carlos Pérez')
    
    ;with ResutSet AS
    (
        SELECT EDIFICIOS_ID,TITULAR FROM @TableA
        --replace with your query here and don't use @TableA
        --  SELECT DISTINCT IM.EDIFICIOS_ID, TI.TITULAR
        --  FROM IMPORTACION IM
        --  INNER JOIN I_EDIFICIO IE ON IM.IMPORTACION_ID=IE.IMPORTACION_ID
        --  INNER JOIN I_EDIFICIO_TITULAR ET ON IM.IMPORTACION_ID=ET.IMPORTACION_ID AND IE.EDIFICIO_ID=ET.EDIFICIO_ID
        --  INNER JOIN I_TITULAR TI ON IM.IMPORTACION_ID=TI.IMPORTACION_ID AND ET.TITULAR_ID=TI.TITULAR_ID
        --  WHERE TI.TITULAR IS NOT NULL AND TI.TITULAR<>''
        --  ORDER BY IM.EDIFICIOS_ID, TI.TITULAR;
    )
    SELECT
        c1.EDIFICIOS_ID
            ,STUFF(
                     (SELECT
                          '; ' + TITULAR
                          FROM ResutSet  c2
                          WHERE c2.EDIFICIOS_ID=c1.EDIFICIOS_ID
                          ORDER BY c1.EDIFICIOS_ID, TITULAR
                          FOR XML PATH('') 
                     )
                     ,1,2, ''
                  ) AS CombinedValue
        FROM ResutSet c1
        GROUP BY c1.EDIFICIOS_ID
        ORDER BY c1.EDIFICIOS_ID
    

    OUTPUT:

    EDIFICIOS_ID CombinedValue
    ------------ ---------------------------------------------------
    1911         Ana María García; Anselmo Piedrahita; Manuel López
    2594         Carlos Pérez; Felisa García
    6865         Carlos Pérez; Felisa García
    8428         Carlos Pérez
    
    (4 row(s) affected)