2011-07-22 60 views
5

我在SQL表中的XML场这样提取数据的SUM从XML在SQL

<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 

但我需要这样的所有代码变量的数值之和:

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

任何想法如何获得标签值的总和?

+0

这绝不是看起来像标准的SQL。你使用什么数据库系统? –

+0

@Álvaro,看起来像T-SQL –

回答

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

这是什么DBMS? –

+0

SQL Server 2008 –

+0

@Arpit,但'value'函数需要2个参数http://msdn.microsoft.com/en-us/library/ms178030.aspx? –

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) 
+0

出现错误:XQuery [TableName.xmlField.value()]:没有函数'{http: //www.w3.org/2004/07/xpath-functions}:SUM()' –

+0

@Arpit你使用SQL Server吗? –

+0

是它的SQL Server 2008 –

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