【问题标题】:MYSQL SELECT CASE with SUM and MAXMYSQL SELECT CASE 与 SUM 和 MAX
【发布时间】:2019-06-10 12:24:28
【问题描述】:

在这个项目中,我试图创建一个查询,根据他/她的成绩返回大学生的 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

ERROR 1111 (HY000):组函数使用无效

我尝试删除 GROUP BY 子句,但我得到了同样的错误。我还删除了 MAX 和 GROUP BY,它起作用了,但是,我得到了所有成绩的总和,这不是我想要的。我想知道我到底做错了什么,或者是否有其他方法可以做到这一点。

谢谢。

【问题讨论】:

    标签: mysql select sum max case


    【解决方案1】:

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

    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
    

    【讨论】:

    • 正是我想要的。谢谢。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2018-06-05
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多