Преобразование SQL-запроса в XQuery, который подсчитывает продажи за два года.

У меня проблемы с получением XQuery для подсчета продаж за два года, он основан на SQL-запросе.

SELECT [ShipCountry] & " " & [ShipCity] AS CountryAndCity, COUNT(OrderID) AS BiYearlySales
FROM Orders
WHERE (((OrderDate) BETWEEN #1/1/1996# And #1/1/1998#))
GROUP BY [ShipCountry] & " " & [ShipCity];

Это xquery, который у меня есть до сих пор, но он учитывает каждый экземпляр только один раз. Не могу понять, почему. Я использую для этого Altova xmlspy - xquery 1.0.

<Result>
{
for $a in doc("Orders.xml")/dataroot/Orders
let $b := concat($a/ShipCountry, " ", $a/ShipCity)
where $a/OrderDate >= '1996-01-01T00:00:00' and $a/OrderDate <= '1998-01-01T00:00:00'
return
<BiYearlySales>
    <CountryNameAndCity>{$b}</CountryNameAndCity>
    <OrderCount>{count($a)}</OrderCount>
</BiYearlySales>
}
</Result>

Я понимаю, что еще не закончил группу, но попытка заставить ее работать имеет большее значение.


person Owny198    schedule 12.03.2012    source источник
comment
К вашему сведению, у нас есть еще два человека, которые просят помочь с точно такой же домашней работой. Возможно, будет полезно взглянуть на другие недавние вопросы с тегом xquery.   -  person Charles Duffy    schedule 13.03.2012


Ответы (1)


Не уверен, что это точно... (не пробовал), но что-то вроде этого:

for $country in doc("Orders.xml")/dataroot/Orders[OrderDate ge '1996-01-01T00:00:00' and OrderDate le '1998-01-01T00:00:00']/ShipCountry, $city in doc(doc("Orders.xml")/dataroot/Orders[OrderDate ge '1996-01-01T00:00:00' and OrderDate le '1998-01-01T00:00:00']/ShipCity")
return 
<sales>
   <geo>{$country, " ", $city)}</geo>
   <count>{count(doc("Orders.xml")/dataroot/Orders
           [OrderDate ge '1996-01-01T00:00:00' and OrderDate le '1998-01-01T00:00:00' 
            and ShipCountry eq $country and ShipCity eq $city])}
   </count>
</sales>
person Eric Bloch    schedule 12.03.2012