我需要给学生出成绩。
我有一个mysql查询给出学生列表,然后我使用select子查询给出基于不同学生活动的几个不同表的结果。
对于一个子查询,我需要一个可以使用case语句计算的总分,但是这是对所有结果进行计算的,我需要它基于每个测试的最佳结果,因为学生经常重复一个测试以获得更好的结果。
group by不适用于select子查询。
我认为distinct是我的解决方案,但我不确定是否可以在一个字段(testid)上执行distinct,同时将case语句基于另一个字段(percentage),尽管我假设如果可能的话,它需要是max(percentage)。
我看到过类似的例子,但它们似乎涉及使用“then”来给出不同的字段,我的例子是使用“then”来提供点。
我将sql简化为下面的问题子查询,它生成一个结果,但不基于每个testid的最佳百分比生成“testpoints”:
SELECT Students.UserID, Students.Name,
(SELECT COALESCE(SUM(Case When percentage >= '90' Then '2'
When percentage < '90' AND percentage > '0' Then '1'
Else '0'
END),0)
FROM TestResults
WHERE Students.UserID = TestResults.UserID) AS testpoints
FROM Students
ORDER BY testpoints DESC
学生表如下:
UserID Name
1 David
2 Daisy
3 Sheila
测试结果如下:
ID UserID TestID percentage
1 1 1 100
2 1 2 100
3 2 1 100
4 2 1 80
5 2 2 100
6 3 2 100
上面的查询在计算同一测试的多次尝试时提供此结果:
UserID Name testpoints
1 David 4
2 Daisy 3
3 Sheila 4
我想得到的是,删除重复项,并根据每个测试的最大百分比计算分数:
UserID Name testpoints
1 David 4
2 Daisy 2
3 Sheila 2
如果有人能帮上忙,我将非常感激。。。
1条答案
按热度按时间58wvjzkj1#
如果我没记错的话,你基本上需要两个层次的聚合:首先得到每个学生和测试的最佳结果,然后求和。
下面是一种在聚合查询上使用联接,然后使用外部聚合的方法: