我正在使用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>
答案 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变量。