【问题标题】:How can i make this query better ? Is this the correct use of the CASE statement?我怎样才能使这个查询更好?这是 CASE 语句的正确用法吗?
【发布时间】:2019-10-13 04:16:04
【问题描述】:

在注册“心理学”课程的学生中。他们中有多少人的 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

【问题讨论】:

  • 嗨,欢迎来到 stackoverflow!为了帮助我们更好地帮助您,如果您可以提供代码示例或指出您正在尝试解决问题的问题,那就太好了。您可能想查看此页面:stackoverflow.com/help/how-to-ask
  • @乔。 . .您的代码不正确。您的 where 仅过滤到没有 grade 但您正在尝试对列进行计算的行。此外,您还有avg()——没有看起来可疑的group by

标签: mysql sql dremel


【解决方案1】:

获得 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

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    相关资源
    最近更新 更多