在Sql中从XML中提取数据的SUM

时间:2011-07-22 07:03:27

标签: sql xml field

我在SQL表中有一个XML字段,如下所示

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

我需要编写一个SQL查询来选择“代码”值的“名称”和SUM

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

但我需要使用所有代码标记的值的SUM,如下所示:

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

有关如何获取标记值总和的任何想法吗?

3 个答案:

答案 0 :(得分:3)

这不是最“优雅”的,我确信有更直接的路线,但你可以试试这个

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字段项中提取数据,然后按名称分组并给出总和。就像我说的那样,不是优雅而是有效!

答案 1 :(得分:2)

您可以使用此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

答案 2 :(得分:0)

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)