zoukankan      html  css  js  c++  java
  • SQL GROUP BY对多个字段进行分组

    参考链接:http://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns

    在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:

    Table: Subject_Selection
    
    Subject   Semester   Attendee
    ---------------------------------
    ITB001    1          John
    ITB001    1          Bob
    ITB001    1          Mickey
    ITB001    2          Jenny
    ITB001    2          James
    MKB114    1          John
    MKB114    1          Erica

    我们想统计每门课程有多少个学生报名,应用如下SQL:

    SELECT Subject, Count(*)
    FROM Subject_Selection
    GROUP BY Subject

    得到如下结果:

    Subject    Count
    ------------------------------
    ITB001     5
    MKB114     2

    因为表里记录了有5个学生选择ITB001,2个学生选择了MKB114。

    产生这个结果的原因是:
    GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里。
    那么GROUP BY X, Y呢?
    GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

    我们下面再接着要求统计出每门学科每个学期有多少人选择,应用如下SQL:

    SELECT Subject, Semester, Count(*)
    FROM Subject_Selection
    GROUP BY Subject, Semester

    上面SQL的意思是,对Subject_Selection表中的数据进行分组,将具有相同Subject和Semester字段值的记录放到同一个分组里去, 然后对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)。

    得到的结果是:

    Subject    Semester   Count
    ------------------------------
    ITB001     1          3
    ITB001     2          2
    MKB114     1          2

    从表中的记录我们可以看出这个分组结果是正确的有3个学生在第一学期选择了ITB001, 2个学生在第二学期选择了ITB001,
    还有两个学生在第一学期选择了MKB114, 没人在第二学期选择MKB114。

    再比如有一个订单表,表中记录了所有支付过的订单

    Table: Order
    
    Product   Buyer       Spending
    ---------------------------------
    PD001     Todd          12.00
    PD001     Todd          12.00
    PD001     Todd          12.00
    PD001     Lily          12.00
    PD001     Lily          12.00
    PD002     Todd          20.00
    PD002     Todd          20.00

    现在我们想统计每个用户在每种商品上总共花了多少钱,执行如下SQL

    SELECT Product,Buyer, SUM(Spending)
    FROM `Order`
    GROUP BY Product, Buyer

    获得的结果如下:

    Product    Buyer     SUM
    ------------------------------
    PD001      Todd      36.00
    PD001      Lily      24.00
    PD002      Todd      40.00

    总结:

    在MYSQL中使用GROUP BY对表中的数据进行分组时,
    GROUP BY X意思是将所有具有相同X字段值的记录放到一个分组里,
    GROUP BY X, Y意思是将所有具有相同X字段值和Y字段值的记录放到一个分组里。

    HAVING

    当然提到GROUP BY 我们就不得不提到HAVING,HAVING相当于条件筛选,但它与WHERE筛选不同,HAVING是对于GROUP BY对象进行筛选。
    我们举个例子:
    每个部门人数都有了,那如果我们想要进一步知道员工人数大于30000的部门是哪些,这个时候就得用到HAVING了。
    语句如下:

    SELECT
        ( SELECT d.dept_name FROM departments d WHERE de.dept_no = d.dept_no ) AS 部门,
        count( de.emp_no ) AS 人数 
    FROM
        dept_emp de 
    WHERE
        de.to_date = '9999-01-01' 
    GROUP BY
        de.dept_no 
    HAVING
        count( de.emp_no ) > 30000 
    
    结果
    作者:Awesome_Tang
    链接:https://www.jianshu.com/p/8b135d373df1


  • 相关阅读:
    Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效
    Django测试开发-19-auth模块之session,cookie
    Django测试开发-19-引入xadmin
    Django测试开发-17-报错:No module named 'django.contrib.staticfiles.templatetags'
    Django测试开发-16-ImportError: cannot import name 'six' from 'django.utils'
    Django测试开发-15-django.utils.encoding未发现 python_2_unicode_compatible包
    Django测试开发-14-数据库表设计:多对多,一对一,一对多
    Django测试开发-13-优化表单提交(GET、POST、登录、注册)
    Django测试开发-12-优化admin (2020-03-13 18:57)
    Django测试开发-11-返回json数据
  • 原文地址:https://www.cnblogs.com/87060524test/p/10402784.html
Copyright © 2011-2022 走看看