我有一个 SQL 查询:
SELECT ShipVia, SUM(Freight)
FROM Orders
GROUP BY ShipVia
它从访问数据库返回以下值
Ship Via TotalFreight
1 $16,185.33
2 $28,244.85
3 $20,512.51
我正在尝试将其转换为 xquery(使用 xquery 1.0)
到目前为止我已经有了这个,
xquery version "1.0";
for $x in doc("Orders.xml")/dataroot/Orders
return
<OrderDetails>
{
$x/ShipVia,
<TotalFreight>{sum($x/Freight)}</TotalFreight>
}
</OrderDetails>
但是,这会输出每个订单以及运费,就像我一样
SELECT ShipVia, Freight
FROM Orders
在 SQL 中
如何让 xquery 实际上像 SQL 命令那样将每一项相加
例如,这些是 Orders.xml 文件中的三个订单
<dataroot>
<Orders>
<ShipVia>1</ShipVia>
<Freight>32.38</Freight>
</Orders>
<Orders>
<ShipVia>1</ShipVia>
<Freight>11.61</Freight>
</Orders>
<Orders>
<ShipVia>2</ShipVia>
<Freight>65.83</Freight>
</Orders>
</dataroot>
编辑:删除不必要的节点(添加重复项)
最佳答案
以下是在 XQuery 1.0 中执行此操作的一种方法(缺少 XQuery 3.0 的 native group by
运算符):
let $doc :=
<dataroot>
<Orders>
<ShipVia>1</ShipVia>
<Freight>32.38</Freight>
</Orders>
<Orders>
<ShipVia>1</ShipVia>
<Freight>11.61</Freight>
</Orders>
<Orders>
<ShipVia>2</ShipVia>
<Freight>65.83</Freight>
</Orders>
</dataroot>
let $ship_via_values := distinct-values($doc/Orders/ShipVia/text())
for $ship_via_value in $ship_via_values
return
<OrderDetails>
<ShipVia>{$ship_via_value}</ShipVia>
<TotalFreight>{
sum($doc/Orders[ShipVia=$ship_via_value]/Freight)
}</TotalFreight>
</OrderDetails>
此查询返回以下结果:
<OrderDetails>
<ShipVia>1</ShipVia>
<TotalFreight>43.99</TotalFreight>
</OrderDetails>
<OrderDetails>
<ShipVia>2</ShipVia>
<TotalFreight>65.83</TotalFreight>
</OrderDetails>
...这似乎是所需的输出。
关于xml - xquery 中的 SUM 和 GROUP BY 以及 1 个 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9676197/