请考虑这个 XML:
<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >
我想用 .对节点内的所有子值求和。对于上面的例子,我想查询返回Parent
ID="p"
30
我怎么能做到这一点?
请考虑这个 XML:
<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >
我想用 .对节点内的所有子值求和。对于上面的例子,我想查询返回Parent
ID="p"
30
我怎么能做到这一点?
select @xml.value('sum(/Parent[@ID = "p"]/Child)', 'float') as Sum
的使用float
防止没有Parent
那个ID
。然后,您可以将此结果转换为int
.
试试这个 :-
Declare @xml xml
set @xml='<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >'
Select @xml.value('sum(/Parent/Child)','int') as Sum
结果 :30
或者如果您想要特定的总和,请Parent ID
尝试以下查询
Select @xml.value('sum(/Parent/Child)','int') AS SumVal
where @xml.exist('/Parent[@ID="p"]') = 1;
SQL FIDDLE中的演示
试试这个——
DECLARE @XML XML
SELECT @XML = '
<Parent ID="p">
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >
<Parent ID="p2">
<Child ID="1">15</Child >
<Child ID="2">20</Child >
<Child ID="3">5</Child >
</Parent >'
SELECT
value = SUM(t.value)
, t.id
FROM (
SELECT
value = p.value('.', 'INT')
, id = p.value('./../@ID', 'VARCHAR(50)')
FROM @XML.nodes('/Parent/Child') t(p)
) t
--WHERE t.id = 'p'
GROUP BY t.id
试试这个 :
DECLARE @SearchKeyWords XML
SET @SearchKeyWords =
'<Parent ID=''p''>
<Child ID="1">10</Child >
<Child ID="2">20</Child >
<Child ID="3">0</Child >
</Parent >'
DECLARE @TempSearchKeyWords TABLE
(
SearchKeyWord INT
)
INSERT INTO @TempSearchKeyWords
SELECT SearchKeyWords.SearchKeyword.value('.',' int ') AS SearchKeyword
FROM @SearchKeyWords.nodes('/Parent/Child') AS SearchKeyWords(SearchKeyword)
SELECT SUM(SearchKeyWord) FROM @TempSearchKeyWords
这将返回 30。