MYSQL SELECT CASE с суммой и максимумом - PullRequest
0 голосов
/ 10 июня 2019

В этом проекте я пытаюсь создать запрос, который возвращает сумму баллов 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, это сработало, однако я получил общее количество всех оценок, а это не то, что я хочу. Мне было интересно, что именно я делаю не так или есть ли другой способ сделать это.

Спасибо.

1 Ответ

1 голос
/ 10 июня 2019

Вы не можете сложить несколько агрегатных выражений в одном запросе. Хитрость заключается в том, чтобы использовать подзапрос для внутреннего агрегата и заключить его в другой запрос для второго агрегата.

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
...