Как я могу улучшить этот запрос? Это правильное использование оператора CASE?

Среди студентов, записавшихся на курс "Психология". какой% из них имеет средний балл> 3?

Студент:

student_id* | student_name | student_gender

Курс:

course_id* | course_name | course_type 

Student_course_grade:

student_id | course_id | grade

Пожалуйста, обратите внимание:

  1. Поле оценки в таблице Student_course_grade представляет собой число в (5,4,3,2,1) вместо буквенной оценки, например (A,B,C,D,E)
  2. Для студента, который зарегистрировался на курс и еще не завершил его, оценка будет нулевой.
  3. 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
Другие вопросы по тегам