Извлечение суммы данных из XML в SQL - PullRequest
5 голосов
/ 22 июля 2011

У меня есть поле XML в таблице SQL, подобное этому

<Root>
 <Name>Apollo</Name>
 <Code>1000</Code>
 <Code>2000</Code>
 <Code>3000</Code>
</Root>

Мне нужно написать запрос SQL для выбора значений «Имя» и СУММА «Код»

SELECT 
 T1.c.value('Name[1] AS VARCHAR(100)') AS Name,
 T1.c.value('Code[1] AS NUMERIC(10,5)') AS TotalCode
FROM TableName
CROSS APPLY xmlField.nodes('Root') AS T1(c)

это дает мне вывод следующим образом:

Name                Code
---------------------------
Apollo              1000
Apollo              2000
Apollo              3000

Но мне нужно СУММУ значений всех тегов кода, например:

Name                Code
---------------------------
Apollo              6000

Есть идеи, как получить сумму значений тегов?

Ответы [ 3 ]

3 голосов
/ 22 июля 2011

Это не самый "элегантный", и я уверен, что есть более прямой маршрут, но вы можете попробовать это

Select
    B.Name,
    SUM(B.TotalCode)
FROM 
(
    SELECT 
       T1.c.value('Name[1]', 'VARCHAR(100)') AS Name,
       T1.c.value('Code[1]', 'NUMERIC(10,5)') AS TotalCode
    FROM TableName
    CROSS APPLY xmlField.nodes('Root') AS T1(c)
) AS B
GROUP BY Name

В основном это первое, что извлекает данные из элементов поля XMLа затем группирует по имени и дает сумму.Как я уже сказал, не элегантно, но работает!

2 голосов
/ 22 июля 2011

Вы можете использовать этот XQuery:

select t.xmlField.value('(//Name)[1]', 'varchar(max)')
    , t.xmlField.value('fn:sum(//Code)', 'int')
from @t t

Пример данных:

declare @t table(xmlField xml)

insert @t values('<Root>
 <Name>Apollo</Name>
 <Code>1000</Code>
 <Code>2000</Code>
 <Code>3000</Code>
</Root>'), 
('<Root>
 <Name>Apollo1</Name>
 <Code>1000</Code>
 <Code>2000</Code>
</Root>'),
('<Root>
 <Name>Apollo3</Name>
 <Code>1000</Code>
 <Code>2000</Code>
 <Code>13000</Code>
</Root>')

Выход:

----------------------
Apollo     6000
Apollo1    3000
Apollo3    16000
0 голосов
/ 22 июля 2011
SELECT 
 T1.c.value('Name[1]', 'VARCHAR(100)') AS Name,
 T1.c.value('sum(Code)', 'NUMERIC(10,5)') AS TotalCode
FROM TableName
CROSS APPLY xmlField.nodes('/Root') AS T1(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...