2

私は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で

SQLコマンドが行うように、xqueryに実際にそれぞれを追加させるにはどうすればよいですか

たとえば、これらは Orders.xml ファイルからの 3 つの注文です。

<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>

編集:不要なノードを削除(重複を追加)

4

1 に答える 1

2

以下は、XQuery 1.0 (XQuery 3.0 のネイティブgroup by演算子がない) でこれを行う 1 つのアプローチです。

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>

...これは望ましい出力のようです。

于 2012-03-13T00:32:03.643 に答える