SQL запрос для получения среднего значения различных типов агрегации в одном запросе - PullRequest
0 голосов
/ 02 мая 2020

Это моя модель данных:

enter image description here

Мне нужно получить среднее имя, фамилию и личные голоса всех учащихся в классе, которые имеют среднее ниже, чем среднее количество голосов всех учащихся в классе. После желаемого результата:

+---------+------+--------+-------------+---------------+
| surname | name |  class |   class_avg |   studend_avg |
+---------+------+--------+-------------+---------------+
| b       | b    |      1 |      4.1250 |        2.7500 |
+---------+------+--------+-------------+---------------+

Я написал следующий запрос, который корректно работает в базе данных mariadb:

SELECT student.surname, student.name, student.classroom, classroom.average AS classroom_average, AVG(vote.vote) AS student_average
    FROM (student INNER JOIN vote ON student.fiscalcode = vote.fiscalcode)
    INNER JOIN
      (select student.classroom AS classroom, AVG(vote.vote) AS average
      FROM student INNER JOIN vote ON student.fiscalcode = vote.fiscalcode
      GROUP BY student.classroom) AS classroom
    ON student.classroom=classroom.classroom
GROUP BY student.surname, student.name, student.classroom, classroom.average
HAVING AVG(vote.vote) < classroom.average;

Но у меня есть эта ошибка в MS Access:

Ваш запрос не включает указанное выражение «AVG (voice.vote) / AVG (voice.vote)

Есть еще один более простой метод написать этот запрос?

1 Ответ

0 голосов
/ 06 мая 2020

Рассмотрим:

SELECT StudentAvg.fiscalcode, student.name, student.surname, StudentAvg.AvgOfvote, ClassAvg.AvgOfvote
FROM ((SELECT student.classroom, student.fiscalcode, Avg(vote.vote) AS AvgOfvote
FROM student INNER JOIN vote ON student.fiscalcode = vote.fiscalcode
GROUP BY student.classroom, student.fiscalcode) As StudentAvg INNER JOIN (SELECT student.classroom, Avg(vote.vote) AS AvgOfvote
FROM vote INNER JOIN student ON vote.fiscalcode = student.fiscalcode
GROUP BY student.classroom) AS ClassAvg ON StudentAvg.classroom = ClassAvg.classroom) INNER JOIN student ON StudentAvg.fiscalcode = student.fiscalcode
WHERE (((StudentAvg.AvgOfvote)<[ClassAvg]![AvgOfvote]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...