我有一张桌子,里面有学生和成绩栏(A-F)。学生可以多次出现在考试中。有时候学生会注册,但不会出现进行测试,因此不会输入成绩,但会输入学生记录。
我希望每个学生都能获得最好的成绩。当我做min(等级)时,如果有任何记录为null,则选择null而不是' A-F'表明结果合适。如果成绩存在,我想获得成绩,如果没有成绩,我想获得成绩。
SELECT `name`,min(grade) FROM `scores` group by `name`
Id | Name | Grade
1 | 1 | B
2 | 1 |
3 | 1 | A
4 | 2 | C
5 | 2 | D
对于名称1,它取得第二个记录,而不是第三个记录具有' A'。
答案 0 :(得分:2)
根据评论中的对话,最简单的解决方案可能是将空字符串转换为null
,并让内置min
函数完成繁重工作:
ALTER TABLE scores MODIFY grade VARCHAR(1) NULL;
UPDATE scores
SET grade = null
WHERE grade = '';
SELECT name, MIN(grade)
FROM scores
GROUP BY name
如果这是不可能的,你可以使用的一个诡计就是让case
表达式将空字符串转换为F
之后你知道的东西:
SELECT name,
MIN(CASE grade WHEN '' THEN 'DID NOT PARTICIPATE' ELSE grade END)
FROM scores
GROUP BY name
如果您确实需要空字符串,则可以在case
周围添加另一个min
表达式:
SELECT name, CASE best_grade WHEN 'HHH' THEN '' ELSE best_grade END
FROM (SELECT name,
MIN(CASE grade WHEN '' THEN 'HHH' ELSE grade END) AS
best_grade
FROM scores
GROUP BY name) t
答案 1 :(得分:0)
将您的查询稍微更改为 -
SELECT `name`,min(grade) FROM `scores` WHERE grade <> "" group by `name`
如果名称分配了等级,则返回最低值,否则结果集将为空