Pivot XML с использованием XQuery и фильтр по атрибуту - PullRequest
0 голосов
/ 30 июля 2010

С учетом следующего XML (в поле столбца SQL с именем «xfield»):

<data>
  <section>
    <item id="A">
      <number>987</number>
    </item>
    <item id="B">
      <number>654</number>
    </item>
    <item id="C">
      <number>321</number>
    </item>
  </section>
  <section>
    <item id="A">
      <number>123</number>
    </item>
    <item id="B">
      <number>456</number>
    </item>
    <item id="C">
      <number>789</number>
    </item>
  </section>
</data>

Как получить следующую структуру таблицы (с именами столбцов A, B и C):

 A | B | C
987|654|321
123|456|789

Используя SQL XQuery, я пытаюсь это (не удивительно, что это неверно):

SELECT
  data.value('(./section/item[@ID = "A"]/number/[1])', 'int') as A,
  data.value('(./section/item[@ID = "B"]/number/[1])', 'int') as B,
  data.value('(./section/item[@ID = "C"]/number/[1])', 'int') as C
FROM Table CROSS APPLY [xfield].nodes('/data') t(data)

1 Ответ

3 голосов
/ 30 июля 2010

Ты почти у цели.

Вам нужно использовать nodes(), чтобы разбить xml на строки , с которыми вы хотите работать, - здесь вам нужна строка набора результатов для каждого элемента section, поэтому уничтожайте с помощью

nodes('/data/section')

Как только вы это сделаете, вам просто нужно сделать синтаксически правильный ваш xpath [1] (и относительно section узлов вы будете «в»):

data.value('(item[@id = "A"]/number)[1]', 'int') as A,
data.value('(item[@id = "B"]/number)[1]', 'int') as B,
data.value('(item[@id = "C"]/number)[1]', 'int') as C

И вуаля:

A           B           C
----------- ----------- -----------
987         654         321
123         456         789
...