如果使用mysql记录一组条件

时间:2019-05-28 15:18:57

标签: mysql

假设我有一个包含两列的表格t1,Student_ID和成绩。数据显示如下:

Student_ID, Grade (1,'A'),(1,'C'),(1,'F'),(1,'A'),(2,'B'),(2,'A'),(2,'C'),(2,'A'). 

现在,我必须将Student_ID与名为“结果”的新列进行分组。 Student_ID 1的分数为'F',所以认为不及格,Student_ID 2的分数为'F',所以认为是及格。需要结果应该是这样。

Student_ID     Result
    1          Failed
    2          Passed

因为该表有500条记录,所以不能手动输入“通过”或“失败”。

SELECT `Student_ID`, (IF(`Grade`='F',"Failed","Passed")) AS `Result`
FROM t1 group by `Student_ID`;

以上代码将不起作用,因为列Grade具有4个非1值。

所以代码将是这样的。

SELECT `Student_ID`, (IF(`Grade` CONTAINS 'F',"Failed","Passed")) AS `Result` FROM t1 group by `Student_ID`;

在sql中没有这样的东西,但是可能是HAVING或IN,但是如何在这里使用它们?

1 个答案:

答案 0 :(得分:0)

您可以将CASE语句与EXISTS一起使用:

select DISTINCT
  t.Student_ID,
  case 
    when exists (
      select 1 from t1 where Student_ID = t.Student_ID and Grade = 'F'
    ) then 'Failed'
    else 'Passed'
  end Result
from t1 t

请参见demo
结果:

| Student_ID | Result |
| ---------- | ------ |
| 1          | Failed |
| 2          | Passed |

您还可以通过对Grade1的每个0'F'not 'F'进行评估,然后按Student_ID进行分组来做到这一点:

select 
  t.Student_ID,
  case sum(t.Result) 
    when 0 then 'Passed'
    else 'Failed'
  end Result
from (select Student_ID, Grade = 'F' Result from t1) t
group by t.Student_ID

请参见demo