Как я могу улучшить этот запрос? Это правильное использование оператора CASE?
Среди студентов, записавшихся на курс "Психология". какой% из них имеет средний балл> 3?
Студент:
student_id* | student_name | student_gender
Курс:
course_id* | course_name | course_type
Student_course_grade:
student_id | course_id | grade
Пожалуйста, обратите внимание:
- Поле оценки в таблице Student_course_grade представляет собой число в (5,4,3,2,1) вместо буквенной оценки, например (A,B,C,D,E)
- Для студента, который зарегистрировался на курс и еще не завершил его, оценка будет нулевой.
- GPA = средний балл (среднее значение всех оценок, выставленных студентом)
Ответ:
Select 100*count(case when avg(b.grade) >3 and b.course_name = ‘Psychology’ then 1 else 0)/count(Case when b.course_name = ‘Psychology’ then 1 else O)
From course a left join
student_course_grade b
On a.courseid=b.courseid Join
student c
On c.studentid=b.student.id
Where b.grade is NULL
1 ответ
Само по себе получение GPA не имеет ничего общего с одним конкретным классом. Подумайте о них по отдельности, а затем присоединитесь, чтобы получить результат. Пример: ваш средний балл> 3 указан исключительно на ВСЕХ курсах, которые прошел человек. Класс психологии просто появляется как флаг. Как только вы примените условие where только к психологии, вы пропустите остальные классы. Таким образом, я получаю средний балл по оценкам, но МАКСИМАЛЬНОЕ (случай / когда), чтобы охватить, ЕСЛИ какие-либо из них были психическим классом. Таким образом, я получаю в первую очередь оценки по всем классам.
select
s.Student_Name,
s.Student_Gender,
AllGPA.GPA
from
( select
cg.Student_ID,
avg(cg.grade) GPA,
max( case when c.course_name = 'Psychology' then 1 else 0 end ) TookPsychClass
from
Course_Grade cg
JOIN Course c
on cg.course_id = c.course_id
group by
cg.Student_ID
having
avg( cg.grade ) > 3
and max( case when c.course_name = 'Psychology' then 1 else 0 end ) = 1
) AllGPA
JOIN Student S
on AllGPA.Student_ID = S.StudentID