5

请考虑这个 XML:

<Parent ID="p">
    <Child ID="1">10</Child > 
    <Child ID="2">20</Child > 
    <Child ID="3">0</Child > 
</Parent > 

我想用 .对节点内的所有子值求和。对于上面的例子,我想查询返回ParentID="p"30

我怎么能做到这一点?

4

4 回答 4

9
select @xml.value('sum(/Parent[@ID = "p"]/Child)', 'float') as Sum

的使用float防止没有Parent那个ID。然后,您可以将此结果转换为int.

于 2013-04-22T10:35:58.043 回答
4

试试这个 :-

 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中的演示

于 2013-04-22T10:16:05.340 回答
1

试试这个——

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
于 2013-04-22T10:22:23.203 回答
1

试试这个 :

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。

于 2013-04-22T10:28:37.783 回答