Ряд Concat из этого запроса
-
22-09-2019 - |
Вопрос
У меня есть этот запрос:
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;
Это возвращает этот набор результатов:
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
Я хочу объединить значения из титульного для каждого edificios_id, поэтому я понимаю:
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
Я пытаюсь использовать Для XML Path Trick. Анкет Я использовал его в прошлом, но, поскольку я не могу понять, как это работает, я не могу понять, как применить это к этому конкретному случаю. Можете ли вы предоставить мне некоторые идеи?
Решение
Попробуйте что -то вроде этого:
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
ВЫХОД:
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)
Другие советы
Это похоже на этот вопрос SO - вы можете найти это полезным в ответе на ваш вопрос. Это конкретно о MySQL, а не SQL Server, но в любом случае, проверьте его.
Редактировать:
Похоже, вам, возможно, придется моделировать Group_Concat для SQL Server - Вот такой вопрос, в котором обсуждается, что.
Надеюсь, это поможет некоторым.
РЕДАКТИРОВАТЬ 2:
Но это заставляет меня задуматься, почему вы не просто делаете это в клиентском приложении, а не через SQL. Кажется, это было бы достаточно просто, чтобы сделать это с помощью полученной таблицы, которая дублировала значения int. Возможно, это может быть подходом?
Это не совсем +, кого вы ищете, но в MSSQL есть другой способ объединить ценности.
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