Запрос MySQL к XQuery

Я пытаюсь получить эквивалент следующего запроса MySQL для XQuery

SELECT S.Classification, COUNT(S.Classification) AS "No. Students", AVG(S.GPA) AS "AVG
    Class. GPA"
FROM Student S
GROUP BY S.Classification
ORDER BY S.Classification ASC;

Это выводит: http://i.stack.imgur.com/Iu0d4.png

Где моя база данных выглядит так:

CREATE TABLE 'Student' (
'StudentID' CHAR(9) NOT NULL,
'Classification' CHAR(10) NULL DEFAULT NULL,
'GPA` DOUBLE NULL DEFAULT NULL,
'MentorID' CHAR(9) NULL DEFAULT NULL,
'CreditHours' INT(11) NULL DEFAULT NULL,
PRIMARY KEY ('StudentID')
)

И в XML:

<Document>
  <Table>
    <StudentID>118784412</StudentID>
    <Classification>Sophomore</Classification>
    <GPA>3.19</GPA>
    <MentorID>201586985</MentorID>
    <CreditHours>39</CreditHours>
  </Table>
</Document>

Я не уверен, как использовать count() и avg() в xquery. С чего начать? Любая помощь приветствуется, спасибо.


person user884685    schedule 15.11.2012    source источник
comment
Какой у вас процессор XQuery? Группировка по явно не поддерживается в XQuery 1.0. Он есть в версиях 1.1 и 3.0, но в настоящее время немногие реализации поддерживают эти спецификации. Однако существуют специфичные для реализации расширения и обходные пути. Также XSLT 2 — хороший вариант для группировки, если вы можете его использовать. Идеальное решение будет зависеть от этих переменных.   -  person wst    schedule 15.11.2012
comment
XQuery 1.0. Я знаю, что не могу использовать «группировать по».   -  person user884685    schedule 20.11.2012
comment
Какой процессор xQuery вы используете? Оптимальная группа по решению будет зависеть от реализации.   -  person wst    schedule 21.11.2012


Ответы (1)


Этого легко добиться с помощью оператора group by, определенного в XQuery 3.0. Предполагая, что данный xml находится в переменной $doc, а каждая строка базы данных находится в другом узле <Table />, вы можете сделать это следующим образом:

for $student in $doc/Table
let $classification := $student/Classification
group by $classification
order by $classification
return 
  <output>
    <Classification>{$classification}</Classification>
    <NoStudents>{count($student)}</NoStudents>
    <AvgGPA>{avg($student/GPA)}</AvgGPA>
  </output>

Существует ряд (отличных) процессоров XQuery, поддерживающих XQuery 3.0, например. BaseX, eXist и Zorba

person dirkk    schedule 16.11.2012
comment
Я не думаю, что могу «группировать по». Я попробовал это и получил ошибку, поэтому я не думаю, что смогу использовать XQuery 3.0. - person user884685; 20.11.2012
comment
Какой процессор вы используете? - person dirkk; 20.11.2012