如何将sql case语句与另一个字段的distinct组合

gijlo24d  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(423)

我需要给学生出成绩。
我有一个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

如果有人能帮上忙,我将非常感激。。。

58wvjzkj

58wvjzkj1#

如果我没记错的话,你基本上需要两个层次的聚合:首先得到每个学生和测试的最佳结果,然后求和。
下面是一种在聚合查询上使用联接,然后使用外部聚合的方法:

select
    s.userID,
    s.name,
    sum(t.testResults) testResults
from students s
inner join (
    select 
        userID, 
        testID, 
        case 
            when max(percentage) >= 90 then 2   
            when max(percentage) >=  0 then 1
            else 0 
        end testpoints
    from testResults
    group by userID, testID
) t on t.userID = s.userID
group by s.userID, s.name

相关问题