使用CASE WHEN获取另一列中的不同记录计数

时间:2017-10-25 19:10:18

标签: mysql sql

我是一个认真的菜鸟,但我还没能找到问题的答案。我的表有三列感兴趣。他们已注册的学生(student_name),班级(class_name)以及他们是否已完成(状态)班级。我希望能够最终计算每个班级有多少学生参加并通过它。

所以我试过这个:

SELECT 
  class_name as Class,

  COUNT_DISTINCT(student_name) as Total_Students,

  COUNT(CASE WHEN status = "COMPLETED" 
    THEN 1, ELSE 0 END) as Total_Completes,

  Total_Completes / Total_Students as Completion_Rate

 ....

GROUP BY Class

但是这给了我夸大的#s,因为单个学生可以为单个班级生成大量的COMPLETED记录。我需要的是完成课程的不同学生的数量。我尝试更改措辞,以便计算嵌套在具有COMPLETED状态的CASE WHEN中的student_names的不同记录,但我无法找出正确的语法(如果存在)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

因此,您应该可以使用内联视图解决问题。

SELECT
   class_name as Class,
   COUNT_DISTINCT(student_name) as Total_Students,
   SUM(CASE WHEN status = "COMPLETED" THEN 1, ELSE 0 END) as Total_Completes,
   Total_Completes / Total_Students as Completion_Rate
FROM
    (SELECT DISTINCT 
         class_name ,
         student_name,
         status 
    FROM 
         ClassTable) as t
GROUP BY 
     class

此内联视图会创建一组独特的班级,学生和状态。但是,由于您仍然有可能为同一个学生“完成”而不是“完成”,您仍然需要在学生姓名上使用COUNT_DISTINCT