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子句中作为分组列”

  • 相关阅读:
    stmt.executeQuery不执行解决办法
    可变参数
    深度理解JVM
    JDBC 基础入门
    Flask中Mysql数据库的常见操作
    Flask与mysql数据库字段类型的区别以及基本用法
    Flask里面session的基本操作
    Flask里面的cookie的基本操作
    Flask表单(form)的应用
    Flask网页模板的入门
  • 原文地址:https://www.cnblogs.com/yc3110/p/13633141.html
Copyright © 2011-2022 走看看