我在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
有关如何获取标记值总和的任何想法吗?
答案 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)