Вопрос

У меня есть этот запрос:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top