【问题标题】:Extracting SUM of data from XML in Sql在Sql中从XML中提取数据的SUM
【发布时间】:2011-10-10 19:55:12
【问题描述】:

我在这样的 SQL 表中有一个 XML 字段

<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

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

【问题讨论】:

  • 这绝不像标准 SQL。你用的是什么数据库系统?

标签: sql xml field


【解决方案1】:

这不是最“优雅”的,我敢肯定还有更直接的路线,但你可以试试这个

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】:

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

【讨论】:

    【解决方案3】:
    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)
    

    【讨论】:

    • 得到一个错误:XQuery [TableName.xmlField.value()]: 没有函数'{w3.org/2004/07/xpath-functions}:SUM()'
    • @Arpit 你使用 SQL Server 吗?
    • 我和 Mikael 的答案运行良好,而 @Mitchel Sellers 返回错误...(SQL Server 2008 R2)
    • @polish:即使接受的答案确实运行了,它也不会使用给定的样本数据返回正确的结果。它只对每个根节点的第一个代码求和。
    • @polish 好吧...我可以运行我发布的代码 :) 但不能运行问题中发布的代码或已接受答案中的代码。
    猜你喜欢
    • 1970-01-01
    • 2021-12-23
    • 2015-08-24
    • 1970-01-01
    • 2020-06-17
    • 2019-01-21
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多