zoukankan      html  css  js  c++  java
  • 关于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子句中作为分组列”

  • 相关阅读:
    JAVA企业级开发-BOM&DOM(03)
    JAVA企业级开发-JavaScript(02)
    JAVA基础--IO输入输出(File使用)17
    day03-CSS(1)
    day02-HTML(2)
    day01-HTML(1)
    apache2.4 只允许合法域名访问网站 禁止使用ip、非法域名访问
    电子书格式转换
    推荐几本学习MySQL的好书
    Linux上vi(vim)编辑器使用教程
  • 原文地址:https://www.cnblogs.com/yc3110/p/13633141.html
Copyright © 2011-2022 走看看