繁体   English   中英

带有SUM和MAX的MYSQL SELECT案例

[英]MYSQL SELECT CASE with SUM and MAX

在这个项目中,我试图创建一个查询,该查询根据大学生的成绩返回大学生的GPA总分。 我正在使用MySQL 5.7.19,数据存储如下:

CourseID     Grade
5              A
8              D-
4              B-
8              B+
2              A

我使用CASE语句将字母等级转换为数字,然后将MAX函数与GROUP BY结合使用,以从多次修读的课程中获得更高的成绩(在本例中为课程8)...

SELECT MAX(
    CASE WHEN Grade = 'A+' OR Grade = 'A' THEN 4
        WHEN Grade = 'A-' THEN 3.67
        WHEN Grade = 'B+' THEN 3.33
        WHEN Grade = 'B'  THEN 3
        WHEN Grade = 'B-' THEN 2.67
        WHEN Grade = 'C+' THEN 2.33
        WHEN Grade = 'C'  THEN 2
        WHEN Grade = 'C-' THEN 1.67
        WHEN Grade = 'D+' THEN 1.33
        WHEN Grade = 'D'  THEN 1
        WHEN Grade = 'D-' THEN 0.67
        ELSE 0 END) AS Grade
FROM courses_taken WHERE Grade IS NOT NULL AND Grade != 'W'
GROUP BY CourseID

效果很好,我得到以下结果:

Grade
4.00
2.67
3.33
4.00

但是我需要获取这些值的总和,当我尝试使用SUM函数时,我得到一个错误:

SELECT SUM(MAX(
    CASE WHEN Grade = 'A+' OR Grade = 'A' THEN 4
        WHEN Grade = 'A-' THEN 3.67
        WHEN Grade = 'B+' THEN 3.33
        WHEN Grade = 'B'  THEN 3
        WHEN Grade = 'B-' THEN 2.67
        WHEN Grade = 'C+' THEN 2.33
        WHEN Grade = 'C'  THEN 2
        WHEN Grade = 'C-' THEN 1.67
        WHEN Grade = 'D+' THEN 1.33
        WHEN Grade = 'D'  THEN 1
        WHEN Grade = 'D-' THEN 0.67
        ELSE 0 END)) AS Total
FROM courses_taken WHERE Grade IS NOT NULL AND Grade != 'W'
GROUP BY CourseID

错误1111(HY000):无效使用组功能

我尝试删除GROUP BY子句,但出现相同的错误。 我也删除了MAX和GROUP BY,但是效果很好,但是我得到了所有成绩的总和,这不是我想要的。 我想知道我到底在做什么错,或者是否有其他方法可以做到这一点。

谢谢。

您不能在同一查询中堆叠多个聚合表达式。 诀窍是对内部聚合使用子查询,然后将其包装在第二个聚合的另一个查询中。

SELECT SUM(Grade) Total
FROM (
SELECT MAX(
    CASE WHEN Grade = 'A+' OR Grade = 'A' THEN 4
        WHEN Grade = 'A-' THEN 3.67
        WHEN Grade = 'B+' THEN 3.33
        WHEN Grade = 'B'  THEN 3
        WHEN Grade = 'B-' THEN 2.67
        WHEN Grade = 'C+' THEN 2.33
        WHEN Grade = 'C'  THEN 2
        WHEN Grade = 'C-' THEN 1.67
        WHEN Grade = 'D+' THEN 1.33
        WHEN Grade = 'D'  THEN 1
        WHEN Grade = 'D-' THEN 0.67
        ELSE 0 END) AS Grade
FROM courses_taken WHERE Grade IS NOT NULL AND Grade != 'W'
GROUP BY CourseID) max_grade

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM