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


  • 相关阅读:
    weblogic weak_password 复现
    redis 4-unacc 复现
    Django debug page XSS漏洞(CVE-2017-12794)复现
    (CVE-2016-4437)Apache Shiro <=1.2.4 反序列化漏洞复现
    Apache SSI 远程命令执行漏洞复现
    Apache HTTPD 未知后缀解析漏洞复现
    s2-005复现
    05 跨站请求伪造漏洞CSRF
    安全大面
    JAVA基础学习day03--流程控制语句
  • 原文地址:https://www.cnblogs.com/87060524test/p/10402784.html
Copyright © 2011-2022 走看看