SQLPLUS - вычисление среднего балла для каждого учащегося с учетом его оценки по каждому курсу, общего количества часов кредита и часов кредита для каждого курса - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть эти таблицы (некоторая информация удалена, так как она не относится к моему вопросу)

  • курс (идентификатор курса, кредиты)
  • студент (идентификатор студента, общее количество кредитов)
  • принимает (course_id, student_id, оценка)
  • grade_point (оценка, баллы)

и мне нужно найти gpa для каждого студента.Это взвешенный gpa, что означает, что формула будет

sum (points * course.credits) / total_credits

В настоящее время я борюсь с тем, как указать SQL для вычисления этого значения для каждого учащегося.Запрос, который я написал, таков:

SELECT student.student_id, (sum(grade_point.points * course.credits) / 
       student.total_credits) AS GPA
FROM   student, course, takes, grade_point
WHERE  grade_point.grade = takes.grade
AND    takes.course_id = course.course_id
AND    student.student_id = takes.student_id;

Но, как и ожидалось, я получаю ошибку о необходимости GROUP BY.Я знаю, что должен быть GROUP BY, если я использую агрегатную функцию, но я не уверен, что сгруппировать это по.

Я прочитал, что вам нужно было бы добавить выражение SELECT, которое нев агрегатной функции для GROUP BY, но если я это сделаю, я получу ORA-00979: not a GROUP BY expression

, я бы хотел избежать использования PL / SQL, поскольку я еще не знаком с этим.Кроме того, поскольку это домашняя задача, я бы предпочел подсказки, а не реальное решение.Спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019

Вы используете агрегатный SQL-запрос, где результаты группируются по учащимся.Вы должны указать это в Oracle, добавив в запрос предложение GROUP BY:

SELECT 
    s.student_id, 
    (SUM(gp.points * c.credits) / s.total_credits) AS GPA
FROM 
    student
    INNER JOIN takes t ON s.student_id = t.student_id
    INNER JOIN course c ON t.course_id = c.course_id
    INNER JOIN grade_point gp ON gp.grade = t.grade
GROUP BY s.student_id, s.total_credits

Еще одна хорошая практика SQL состоит в использовании явных JOIN s вместо неявного синтаксиса (то есть имен таблиц, разделенныхзапятая в предложении FROM и условия соединения в предложении WHERE).Я изменил ваш запрос следующим образом.

Также неплохо использовать псевдонимы таблиц: это делает запрос более читабельным и, как правило, позволяет избежать конфликтов имен.

...