2012-03-05 91 views
1

我試圖將下面的代碼轉換爲xquery,以便結果保持不變。我試圖計算總運費爲每一個客戶Group by in xquery

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

測試數據爲customers.xml和命令如下

<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嗎? – 2012-03-05 16:42:19

+0

我使用1998年的數據庫(羅斯文),因此我非常懷疑它會支持它。我讀到了這一點,似乎他們正在接近SQL功能。 – 2012-03-05 20:32:21

回答

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 S,然而,因此它沒有返回此查詢的測試數據;我不得不嘲笑我自己的。做完這些,但是,我得到的輸出類似於如下:

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

非常感謝您的回覆,並會嘗試一下。 – 2012-03-05 19:29:10

+0

查詢似乎沒有返回任何值。 – 2012-03-05 19:36:31

+0

謝謝我解決了這個問題,就像/ dataroot/Order/CustomerID一樣,它試圖使用一個尚未被調用的xml文件,所以我做了修改以包含文檔名稱 – 2012-03-05 19:41:16