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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top