如何从含重复布尔值的MySQL表中按学生分组统计通过状态
跨行判断学生考试通过状态的MySQL实现
原始数据表
| Name | Subject | ExamType | Passed |
|---|---|---|---|
| Bryan | 科学 | 理论 | True |
| Bryan | 科学 | 实践 | False |
| Joe | 科学 | 理论 | True |
| Joe | 科学 | 实践 | True |
| Jill | 科学 | 理论 | False |
| Jill | 科学 | 实践 | False |
| Jack | 科学 | 理论 | False |
| Jack | 科学 | 实践 | True |
期望结果表
| Name | Passed |
|---|---|
| Bryan | True |
| Joe | True |
| Jill | False |
| Jack | True |
解决方案
你可以通过分组聚合实现需求,核心是按学生姓名分组后,判断组内是否存在至少一次通过记录:
方法一(适用于Passed为布尔类型)
MySQL中布尔值True等价于1,False等价于0,直接用MAX()聚合函数就能得到结果:
SELECT Name, MAX(Passed) AS Passed FROM your_table_name GROUP BY Name;
GROUP BY Name:将同一学生的所有考试记录合并为一组MAX(Passed):取组内Passed的最大值——只要有一次考试通过,结果就是True,全部未通过则为False
方法二(适用于Passed为字符串类型)
如果Passed存储的是'True'/'False'字符串,用CASE语句配合聚合判断:
SELECT Name, CASE WHEN SUM(CASE WHEN Passed = 'True' THEN 1 ELSE 0 END) > 0 THEN 'True' ELSE 'False' END AS Passed FROM your_table_name GROUP BY Name;
- 内层
CASE将'True'转为1,'False'转为0 SUM()统计该学生通过的考试次数,大于0则标记为'True',否则为'False'
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

