關於Mysql分組聚合函數的一個大坑(易錯點)


score 表格如下:

題目: 按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績

            

 

 

select `s_id`, avg(`s_score`),

max(CASE when `c_id` = 01 then `s_score` else null end) as "語文",
max(CASE when `c_id` = 02 then `s_score` else null end) as "數學",
max(CASE when `c_id` = 03 then `s_score` else null end) as "英語"

FROM
score 
group BY
`s_id`
ORDER BY avg(`s_score`) desc

  輸出正確結果:

 

      但是在想:既然case都判定課程編號了,那為什么還要用聚合函數max(sum也可以)呢?去掉聚合函數之后。

select `s_id`, avg(`s_score`),

(CASE when `c_id` = 01 then `s_score` else null end) as "語文",
(CASE when `c_id` = 02 then `s_score` else null end) as "數學",
(CASE when `c_id` = 03 then `s_score` else null end) as "英語"

FROM
score 
group BY
`s_id`
ORDER BY avg(`s_score`) desc

  輸出結果:

 

 明顯出現錯誤。

      分析:這里跟case when沒有多大關系,這是因為分組函數一定和聚合函數一同存在,要不然你想,比如上述數據,按照名字分組后,每個組內都有三個數據,而展示的時候就只展示第一條,而只有當與聚合函數一起使用的時候才會在聚合列的要選擇字段進行迭代。

  同理:sql書寫要求:“出現在SELECT子句中的單獨的列,必須出現在GROUP BY子句中作為分組列”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM