2012-03-05 8 views
1

次のコードをxqueryに変換して、結果が同じになるようにしようとしています。私はcustomers.xmlのために、各顧客のためにxqueryでグループ化する

SELECT 
    c.CompanyName, SUM(o.freight) AS [Total Freight Costs] 
FROM 
    Customers c, Orders o 
WHERE 
    c.CustomerID = o.CustomerID 
GROUP BY 
    CompanyName 

テストデータを総運送コストを計算しようとしていると

<dataroot> 
    <Customers> 
    <CustomerID>ALFKI</CustomerID> 
    <CompanyName>Alfreds Futterkiste</CompanyName> 
    <ContactName>Maria Anders</ContactName> 
    <ContactTitle>Sales Representative</ContactTitle> 
    <Address>Obere Str. 57</Address> 
    <City>Berlin</City> 
    <PostalCode>12209</PostalCode> 
    <Country>Germany</Country> 
    <Phone>030-0074321</Phone> 
    <Fax>030-0076545</Fax> 
    </Customers> 
    <Customers> 
    <CustomerID>ANATR</CustomerID> 
    <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> 
    <ContactName>Ana Trujillo</ContactName> 
    <ContactTitle>Owner</ContactTitle> 
    <Address>Avda. de la Constitución 2222</Address> 
    <City>México D.F.</City> 
    <PostalCode>05021</PostalCode> 
    <Country>Mexico</Country> 
    <Phone>(5) 555-4729</Phone> 
    <Fax>(5) 555-3745</Fax> 
    </Customers> 
</dataroot> 

Orders.xml

<dataroot> 
    <Orders> 
    <OrderID>10248</OrderID> 
    <CustomerID>WILMK</CustomerID> 
    <EmployeeID>5</EmployeeID> 
    <OrderDate>1996-07-04T00:00:00</OrderDate> 
    <RequiredDate>1996-08-01T00:00:00</RequiredDate> 
    <ShippedDate>1996-07-16T00:00:00</ShippedDate> 
    <ShipVia>3</ShipVia> 
    <Freight>32.38</Freight> 
    <ShipName>Vins et alcools Chevalier</ShipName> 
    <ShipAddress>59 rue de l&apos;Abbaye</ShipAddress> 
    <ShipCity>Reims</ShipCity> 
    <ShipPostalCode>51100</ShipPostalCode> 
    <ShipCountry>France</ShipCountry> 
    </Orders> 
</dataroot> 

これは何をされ、次のように注文があります私はこれまでに持っています

for $o in doc("Orders.xml")/dataroot/Orders, 
    $c in doc("Customers.xml")/dataroot/Customers[CustomerID = $o/CustomerID] 

return 
<OrderDetails> 
{ 
    $c/CompanyName, 
    sum($o/Freight) 
} 
</OrderDetails> 
+0

XQuery 3.0は、ドラフトでのみ使用されていますが、FLWOR式で明示的にグループ化されています。どのデータベースを使用していますか?それはXQuery 3.0をサポートしていますか? –

+0

私は1998データベース(Northwind)を使用しているので、私はそれがそれをサポートすることは非常に疑いがあります。私はそれを読んで、彼らはSQLの機能に近づいているようだ。 –

答えて

3

シンプル十分:

(: select only customers with at least one order :) 
for $c in doc("Customers.xml")/dataroot/Customers 
    [doc("Orders.xml")/dataroot/Orders/CustomerID=./CustomerID] 

(: get the list of orders for this customer :) 
let $o := doc("Orders.xml")/dataroot/Orders[CustomerID = $c/CustomerID] 

(: ...and properly encapsulate the calculated value in the result :) 
return 
    <OrderDetails> 
    {$c/CompanyName} 
    <TotalFreight>{sum($o/Freight)}</TotalFreight> 
    </OrderDetails> 

それは、このクエリに対して何も返しませんので、あなたが与えたテストデータは、しかし、何のマッチングCustomerID秒を持っていません。私は自分自身をモックアップしなければならなかった。それが完了すると、しかし、私は次のように似た出力を得る:

<OrderDetails> 
    <CompanyName>Alfreds Futterkiste</CompanyName> 
    <TotalFreight>45.58</TotalFreight> 
</OrderDetails> 
+0

私はあなたの返事に非常に感謝し、それを試してみます。 –

+0

クエリは値を返さないようです。 –

+0

ありがとう、/ dataroot/Order/CustomerIDと同じように問題が発生しました。これは呼び出されていないxmlファイルを使用しようとしていますので、文書名を含むように変更しました –

関連する問題