2011-07-22 27 views
5

Tôi có một lĩnh vực XML trong bảng SQL như thế nàyExtracting SUM dữ liệu từ XML trong Sql

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

tôi cần phải viết một truy vấn SQL để chọn 'Tên' và SUM các giá trị 'Mã'

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) 

nó mang lại cho tôi ra như thế này:

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

Nhưng tôi cần SUM các giá trị của tất cả các thẻ Mã như thế này:

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

Bất kỳ ý tưởng nào về cách nhận tổng giá trị thẻ?

+0

này không có nghĩa là giống như SQL tiêu chuẩn. Bạn đang sử dụng hệ thống cơ sở dữ liệu nào? –

+0

@ Álvaro, Hình như T-SQL –

Trả lời

3

Đây không phải là nhất "tao nhã" và tôi chắc chắn rằng có một con đường trực tiếp hơn, nhưng bạn có thể thử này

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 

Về cơ bản này đầu tiên kéo dữ liệu ra các mục lĩnh vực XML và sau đó nhóm theo Tên và cho tổng. Như tôi đã nói, không thanh lịch nhưng hoạt động!

+1

DBMS là gì? –

+0

SQL Server 2008 –

+0

@Arpit, nhưng hàm 'value' yêu cầu 2 đối số 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

Nhận lỗi: XQuery [TableName.xmlField.value()]: Không có hàm '{http: //www.w3.org/2004/07/xpath-functions}: SUM() ' –

+0

@Arpit Bạn có sử dụng SQL Server không? –

+0

Có SQL Server 2008 –

2

Bạn có thể sử dụng XQuery này:

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

mẫu dữ liệu:

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

Output:

---------------------- 
Apollo  6000 
Apollo1 3000 
Apollo3 16000 
Các vấn đề liên quan