2011-07-22 47 views
5

tengo un campo XML en la tabla de SQL como estoextracción suma de los datos de XML en SQL

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

Tengo que escribir una consulta SQL para seleccionar 'Nombre' y la suma de los valores de 'código'

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) 

me da salida como esta:

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

pero necesito suma de valores de todas las etiquetas de código como este:

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

¿Alguna idea de cómo obtener la suma de los valores de las etiquetas?

+0

Esto de ninguna manera se parecen a SQL estándar. ¿Qué sistema de base de datos estás usando? –

+0

@ Álvaro, parece que T-SQL –

Respuesta

3

Este no es el más "elegante" y estoy seguro de que hay una ruta más directa, pero se puede probar este

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 

Básicamente esta primera tira de los datos de los elementos de campo y XML luego agrupa por nombre y da la suma. Como dije, ¡no es elegante, pero funciona!

+1

¿Qué DBMS es este? –

+0

SQL Server 2008 –

+0

@Arpit, pero la función 'value' requiere 2 argumentos 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

Obteniendo un error: XQuery [TableName.xmlField.value()]: No hay función '{http: //www.w3.org/2004/07/xpath-functions}: SUM() ' –

+0

@Arpit ¿Utiliza SQL Server? –

+0

Sí es SQL Server 2008 –

2

Puede utilizar esta XQuery: datos

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

muestra:

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>') 

Salida:

---------------------- 
Apollo  6000 
Apollo1 3000 
Apollo3 16000 
Cuestiones relacionadas