Использование FOR XML для объединения нескольких полей - PullRequest
0 голосов
/ 21 ноября 2018

Мои данные структурированы так:

, и я пытаюсь использовать STUFF / FOR XML PATH для объединения полей.

Если я используюпримеры, которые я нахожу в Интернете, я могу получить следующий результат:

Но я подумал, возможно ли следующее:

В настоящее время я достигаю этого, дважды вызывая FOR XML PATH, сначала конкатенируя Header3:

, а затем снова, чтобы получить желаемый результат.

IsЕсть ли способ сделать это, не вызывая XML PATH дважды?

1 Ответ

0 голосов
/ 21 ноября 2018

Вы ищете что-то вроде

CREATE TABLE T(
  Header1 INT,
  Header2 VARCHAR(45),
  Header3 VARCHAR(45)
);

INSERT INTO T VALUES
(123, 'A', 'aaa'),
(123, 'B', 'bbb'),
(123, 'C', 'ccc'),
(123, 'C', 'ddd'),
(456, 'E', 'eee');

WITH H3 AS
(
  SELECT DISTINCT Header1, Header2,
         STUFF(
           (
             SELECT ',' + Header3
             FROM T
             WHERE Header2 = H2.Header2
             FOR XML PATH('')
           ), 1, 1, ''
         ) Res
FROM T H2
)

SELECT DISTINCT
       Header1,
       STUFF(
         (SELECT ' '+ Header2 + ':' + Res + '|'
          FROM H3
          WHERE Header1 = TT.Header1
          FOR XML PATH('')
         ), 1, 1, ''
       ) Desired
FROM H3 TT;

Возвраты:

+---------+--------------------------+
| Header1 |         Desired          |
+---------+--------------------------+
|     123 | A:aaa| B:bbb| C:ccc,ddd| |
|     456 | E:eee|                   |
+---------+--------------------------+

Демо

...