concat fila da questa query
-
22-09-2019 - |
Domanda
Ho questa domanda:
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;
che restituisce questo set di risultati:
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
Voglio concatenare i valori dal TITOLARE per ogni EDIFICIOS_ID, così ottengo questo:
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
Sto cercando di utilizzare il FOR XML PATH trucco . L'ho usato in passato, ma, dal momento che non posso davvero capire come funziona, io non riesco a capire come applicare a questo caso specifico. Puoi fornirmi qualche idea?
Soluzione
provare qualcosa di simile:
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
USCITA:
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)
Altri suggerimenti
Questo sembra simile a questa domanda su SO - si potrebbe trovare utile per rispondere alla tua domanda. È proprio su MySQL server non SQL, ma in ogni caso, a controllare.
Modifica:
Sembra che si può avere per simulare group_concat per SQL Server - ecco una domanda SO che discute che .
La speranza che aiuta un po '.
Modifica 2:
Ma che fa mi chiedo perché non basta fare questo sul applicazione client e non tramite SQL. Sembra che sarebbe abbastanza semplice per ottenere questo risultato con la tabella recuperata che ha duplicato valori int. Forse questo potrebbe essere un approccio adottare?
Questo non è esattamente + che stai cercando, ma ci sono un altro modo su MSSQL per concatenare valori.
SELECT DISTINCT
1 AS TAG,
NULL AS PARENT,
EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID],
NULL AS [EDIFICIOS!1!TITULAR!IDREFS]
FROM
@TABLEA
UNION ALL
SELECT DISTINCT
1 AS TAG,
NULL AS PARENT,
EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID],
TITULAR+';' AS [EDIFICIOS!1!TITULAR!IDREFS]
FROM
@TABLEA
ORDER BY
[EDIFICIOS!1!EDIFICIOS_ID]
FOR XML EXPLICIT