使用XQuery求和

时间:2012-05-18 10:08:59

标签: xquery xquery-sql

我正在使用XQuery来执行添加。以下是保存在数据库中的XML结构:

    <Events>
        <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
             <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
    </Events>

我想通过使用XQuery获得低于输出:具有相同代码的金额之和。请注意,.。我需要将,替换为.和执行算术运算。

 <Total>               
            <1001> 100,2 </1001>
            <1002> 11,0 </1002>
   </Total>

3 个答案:

答案 0 :(得分:6)

如果您的XQuery处理器支持XQuery 3.0,请使用group by语句。

<Total>
{
  for $i in //Event
  let $code := $i/code
  group by $code
  return element {"code"} { attribute {"id"} {$code}, sum($i/Amount)}
}
</Total>

您的问题中的XML代码段有两点不同:我将浮点分隔符更改为点(这是必需的,当然您也可以使用某些XQuery字符串操作来执行此操作),元素名称可能不包含数字只有,看看element naming rules。我决定在我的例子中将代码作为id-attribute返回。

答案 1 :(得分:3)

这将为您提供数据作为结果集。

declare @X xml
set @X = 
'<Events>
        <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
             <Event>
            <id>1</id>
            <code>1001</code>
            <Amount>50,1</Amount>
        </Event>
        <Event>
            <id>1</id>
            <code>1002</code>
            <Amount>5,5</Amount>
        </Event>
    </Events>'

select T.code,
       sum(Amount) as Amount
from
  (
    select T.X.value('code[1]', 'int') as code,
           cast(replace(T.X.value('Amount[1]', 'varchar(13)'), ',', '.') as float) as Amount
    from @X.nodes('Events/Event') as T(X)
  ) as T
group by T.code

答案 2 :(得分:2)

以下代码将计算总数并将结果输出为XML,但不会输出到输出中(无效):

SELECT Code AS 'Code', SUM(Value) AS 'Total'
FROM (
SELECT
    CONVERT(DECIMAL(9,2), REPLACE(c.value('Amount[1]', 'VARCHAR(10)'), ',', '.')) AS Value
    , c.value('code[1]', 'INT') AS Code
FROM @x.nodes('//Event') AS t(c)
) t
GROUP BY Code
FOR XML PATH('Total'), ROOT('Totals')

其中@x是包含数据的XML变量。