簡體   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