【问题标题】:How to combine SQL CASE statement with DISTINCT of another field如何将 SQL CASE 语句与另一个字段的 DISTINCT 结合起来
【发布时间】:2020-09-09 11:36:00
【问题描述】:

我需要为学生提供结果。

我有一个 MySQL 查询给出学生列表,然后我使用 SELECT 子查询根据不同的学生活动从几个不同的表中给出结果。

对于一个子查询,我需要一个可以使用 CASE 语句计算的总分,但是这是根据所有结果计算的,我需要它基于每次测试的最佳结果,因为学生经常重复测试以获得更好的成绩结果。

GROUP BY 不适用于 SELECT 子查询。

我认为 DISTINCT 将是我的解决方案,但我不确定是否可以在一个字段 (TestID) 上执行 DISTINCT,同时将 CASE 语句基于不同的字段(百分比),尽管我认为它需要是 MAX(百分比) 如果那是可能的。

我看到了类似的例子,但它们似乎涉及使用“Then”来给出 DISTINCT 字段,而我的例子是使用“Then”来提供分数。

我已将 SQL 简化为下面的问题子查询,该子查询会产生结果,但没有根据每个 TestID 的最佳百分比制作“测试点”:

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 

TestResults 是这样的:

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 

如果有人可以帮助我,我将非常感激......

【问题讨论】:

标签: mysql sql join group-by sum


【解决方案1】:

如果我正确地遵循了你,你基本上需要两个级别的聚合:首先获得每个学生的最佳结果并进行测试,然后将它们相加。

这是一种在聚合查询上使用连接,然后是外部聚合的方法:

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

【讨论】:

  • 是的,我认为您正确地理解了我,并且对于我创建的样本数据集似乎可以正常工作。我将把它改编成完整的数据库,但到目前为止一切都很好!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2015-05-18
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2014-04-05
相关资源
最近更新 更多