2012-03-05 2 views
1

결과가 동일하게 유지되도록 다음 코드를 xquery로 변환하려고합니다. 나는 customers.xml 각 고객에 대한Group 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 

테스트 데이터를 총 운송 비용을 계산하려고하고

<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 파일을 사용하려고했기 때문에 문제가 있음을 알아 냈습니다. 문서 이름을 포함하도록 수정했습니다. –