SUM und GROUP BY in xquery mit 1 XML-Datei
Frage
Ich habe eine SQL-Abfrage:
SELECT ShipVia, SUM(Freight)
FROM Orders
GROUP BY ShipVia
Dies gibt die folgenden Werte aus der Access-Datenbank zurück
Ship Via TotalFreight
1 $16,185.33
2 $28,244.85
3 $20,512.51
Ich versuche, dies in xquery zu konvertieren (mit xquery 1.0).
Bisher habe ich das,
xquery version "1.0";
for $x in doc("Orders.xml")/dataroot/Orders
return
<OrderDetails>
{
$x/ShipVia,
<TotalFreight>{sum($x/Freight)}</TotalFreight>
}
</OrderDetails>
Dies gibt jedoch jede einzelne Bestellung zusammen mit den Frachtkosten aus, als ob ich es getan hätte
SELECT ShipVia, Freight
FROM Orders
in SQL
Wie kann ich dafür sorgen, dass die xquery tatsächlich jeden einzelnen addiert, wie es der SQL-Befehl tut?
Dies sind beispielsweise drei Bestellungen aus der Datei 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>
BEARBEITEN:Nicht benötigte Knoten entfernt (Duplikat hinzugefügt)
Lösung
Das Folgende ist ein Ansatz, dies in XQuery 1.0 zu tun (dem die native Version von XQuery 3.0 fehlt). group by
Operator):
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>
Diese Abfrage gibt das folgende Ergebnis zurück:
<OrderDetails>
<ShipVia>1</ShipVia>
<TotalFreight>43.99</TotalFreight>
</OrderDetails>
<OrderDetails>
<ShipVia>2</ShipVia>
<TotalFreight>65.83</TotalFreight>
</OrderDetails>
...was die gewünschte Ausgabe zu sein scheint.