在sql server 2008中总结一些xml节点值

时间:2013-04-22 10:10:18

标签: sql sql-server xml sql-server-2008 xpath

请考虑这个XML:

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

我希望<{> 1}} Parent节点内的所有子值 SUM 。对于上面的示例,我想要查询返回ID="p"

我怎么能这样做?

4 个答案:

答案 0 :(得分:6)

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

float的使用可防止ParentID无关。然后,您可以将此结果投射到int

答案 1 :(得分:2)

试试这个: -

 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

中的演示

答案 2 :(得分: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

答案 3 :(得分: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。