Как я могу сделать этот запрос лучше? Это правильное использование оператора CASE? - PullRequest
0 голосов
/ 13 октября 2019

Среди студентов, зарегистрированных на курс «Психология». какие% из них имеют средний балл> 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 Ответ

0 голосов
/ 13 октября 2019

Получение самого 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
...