简体   繁体   English

带有SUM和MAX的MYSQL SELECT案例

[英]MYSQL SELECT CASE with SUM and MAX

In this project I'm trying to create a query that returns the total of GPA points of a college student according to his/her grades. 在这个项目中,我试图创建一个查询,该查询根据大学生的成绩返回大学生的GPA总分。 I'm using MySQL 5.7.19 and the data is stored as follows: 我正在使用MySQL 5.7.19,数据存储如下:

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

I used a CASE statement to convert the letter grades to numbers and used the MAX function combined with GROUP BY to get only the higher grade from courses taken more than once (in this case course # 8)... 我使用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

That works fine, I get the following results: 效果很好,我得到以下结果:

Grade
4.00
2.67
3.33
4.00

But I need to get the sum of those values and when I try using the SUM function I get an error: 但是我需要获取这些值的总和,当我尝试使用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

ERROR 1111 (HY000): Invalid use of group function 错误1111(HY000):无效使用组功能

I tried removing the GROUP BY clause but I got the same error. 我尝试删除GROUP BY子句,但出现相同的错误。 I also removed MAX and GROUP BY, it worked, however, I got the total of all the grades, which is not what I want. 我也删除了MAX和GROUP BY,但是效果很好,但是我得到了所有成绩的总和,这不是我想要的。 I was wondering what exactly I'm doing wrong or if there is any other way to accomplish this. 我想知道我到底在做什么错,或者是否有其他方法可以做到这一点。

Thanks. 谢谢。

You can't stack multiple aggregate expressions in the same query. 您不能在同一查询中堆叠多个聚合表达式。 The trick is to use a sub query for the inner aggregate & wrap it in another query for the 2nd aggregate. 诀窍是对内部聚合使用子查询,然后将其包装在第二个聚合的另一个查询中。

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