2

我正在使用 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>
4

3 回答 3

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 字符串操作来执行此操作)并且元素名称可能不仅仅包含数字,有看看元素命名规则。在我的示例中,我决定将代码作为 id-attribute 返回。

于 2012-05-18T10:34:35.170 回答
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
于 2012-05-18T10:30:25.043 回答
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 变量。

于 2012-05-18T10:36:42.510 回答