我怎样才能使这个查询更好?这是CASE语句的正确用法吗?

时间:2019-10-13 04:16:04

标签: mysql sql dremel

在注册“心理学”课程的学生中。他们中有多少%的GPA> 3?

学生:

student_id* | student_name | student_gender

课程:

course_id* | course_name | course_type 

学生课程成绩:

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 :(得分:0)

获取GPA本身与单个特定类无关。单独考虑它们,然后加入以获得结果。例如:您的GPA> 3仅适用于一个人参加的所有课程。心理学课刚好是一个标志。只要将一个where条件应用到心理学上,您就会错过其余的课程。这样,我得到的是平均成绩,但是如果有任何心理障碍,则可以通过MAX(case / when)来捕获。这样,我就能获得所有班级的头等舱成绩。

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
相关问题