我有一个mysql表
表名'结果'
Reg.No SubjectCode Attempt Grade Marks
112108 CMIS 1113 1 D 17
112110 CMIS 1114 1 A 85
112119 CMIS 1114 1 D 18
112108 CMIS 1113 2 D+ 25
112110 CMIS 1113 1 D+ 25
112107 CMIS 1113 1 B 70
112108 CMIS 1113 3 C 40
112110 CMIS 1113 2 C 40
112119 CMIS 1114 2 C 42
112120 CMIS 1114 1 D 17
这是关于学生的#39;结果。
学生至少需要一个" C"
(标记> 40)通过主题。
直到通过,学生可以拥有
几次尝试。
但从第二次尝试最高等级他们
可以得到的是" C"
因此,那些无法通过该课程的学生
第一次尝试,过去再次尝试,直到他们通过主题
因此,对于最终结果表,每个科目都将考虑最高结果(最高分由最高分给出)
因此,例如CMIS 1113的最高分112108是40
同样,我想让学生获得ecch科目的成绩(但总是会考虑最大分数)
实际上我的预期结果表应该是这样的
Reg.No SubjectCode Attempt Grade Marks
112110 CMIS 1114 1 A 85
112107 CMIS 1113 1 B 70
112108 CMIS 1113 3 C 40
112110 CMIS 1113 2 C 40
112119 CMIS 1114 2 C 42
112120 CMIS 1114 1 D 17
那么如何使用sql查询检索这些数据呢?
答案 0 :(得分:3)
要为每位学生只获得一个值,请按Reg.No和SubjectCode进行分组,然后获取每个主题的最大值。此查询应该有效:
SELECT
`Reg.No`,
`SubjectCode`,
`Attempt`,
`Grade`,
MAX(`marks`) AS marks
FROM
`results`
GROUP BY
`Reg.No`, `SubjectCode`
为了获取所有列,您需要两个查询,这些查询可以与子查询放在一起。它看起来像这样:
SELECT *
FROM
(SELECT *
FROM `results`
ORDER BY `Grade` ASC) AS t
GROUP BY
`Reg.No`, `SubjectCode`
ORDER BY
`Grade` ASC
“内部查询”将获取所有结果,并按Grade
列从低到高对行进行排序。 “外部查询”不仅仅将它们分组(不使用MAX
函数)。这将导致每个分组的最后一行,而不是最大结果(正如我们在“内部查询”中那样排序)。
答案 1 :(得分:1)
使用子查询来确定哪个是最高标记并加入到该标记:
SELECT r.`Reg.No`, r.SubjectCode, MAX(Attempt), r.Grade, r.marks
FROM results r
JOIN (SELECT `Reg.No`, SubjectCode, MAX(marks) AS marks
FROM results
GROUP BY 1, 2) m
ON m.`Reg.No` = r.`Reg.No`
AND m.SubjectCode = r.SubjectCode
AND m.marks = r.marks
GROUP BY 1, 2, 4, 5
外部分组是当学生多次为某个主题达到相同标记时打破关系。
答案 2 :(得分:0)
尝试这样做
SELECT * FROM results WHERE marks > 40 Order By Marks Desc
这将列出大于40的结果,并且最高标记将首先显示您也可以使用限制,以便您可以根据需要获取记录