Строка concat из этого запроса - PullRequest
0 голосов
/ 24 марта 2010

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

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

Я хочу объединить значения из TITULAR для каждого 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

Я пытаюсь использовать трюк FOR XML PATH . Я использовал его в прошлом, но, поскольку я не могу понять, как это работает, я не могу понять, как применить его к этому конкретному случаю. Можете ли вы дать мне несколько идей?

Ответы [ 3 ]

3 голосов
/ 24 марта 2010

попробуйте что-то вроде этого:

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)
0 голосов
/ 25 марта 2010

Это не совсем +, кого вы ищете, но есть и другой способ на 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
0 голосов
/ 24 марта 2010

Это похоже на этот вопрос на SO - вам может пригодиться ответ на ваш вопрос. Речь идет конкретно о MySQL, а не о sql server, но в любом случае, проверьте это.


Edit:

Похоже, вам, возможно, придется смоделировать group_concat для SQL Server - вот такой вопрос, который обсуждает, что .

Надеюсь, это поможет некоторым.


Редактировать 2:

Но это заставляет меня задуматься, почему вы не просто делаете это в клиентском приложении, а не через SQL. Кажется, было бы достаточно просто сделать это с помощью извлеченной таблицы, которая дублировала значения int. Возможно, это может быть подход, чтобы принять?

...