Skip to content

分组

功能描述

分组子句关键字为GROUP BY,通过GROUP BY指定的规则将数据划分为若干组,再对每一组的数据进行处理,分组子句通常配合聚合函数进行统计数据。GROUP BY指定的规则即字段信息可以包含FROM子句中的表、视图的任何列,若查询仅返回聚合函数结果则GROUP BY指定的列可以不在选择列表中,若查询返回聚合函数结果和其他字段信息则GROUP BY指定的列必须在返回的选择列表中。

GROUP BY扩展功能:

  • ROLLUP:n+1次分组统计,其中n为分组字段数,按照从右至左依次递减字段生成分组统计,即对每个分组结果再进行小计和总和。如ROLLUP(a,b)的分组为(a,b)(a)()三种情况,第一次将整体作为条件进行分组小计,第二次对分组统计的最后一个字段删减作为条件再进行分组小计,第三次再次从右至左删减字段作为条件进行分组小计即为无条件将整个表进行统计。
  • CUBE:多字段分组时按照聚合字段排列组合进行分组统计并对每一种组合结果进行汇总统计。如CUBE(a,b)统计的分组为(a,b)(a)(b)()情况。
  • GROUPING SETS:无需所有分组字段的排列组合仅返回每个字段的分组小计。如GROUPING SETS(a,b)统计的分组为(a)(b)情况。

语法格式请参见查询语法章节。

示例

  • 示例1
    无指定字段返回。

    sql
    SQL> CREATE TABLE grp_tb(id INT,name VARCHAR(20));
    SQL> INSERT INTO grp_tb VALUES(1,'abc')(2,'def')(1,'one');
    
    SQL> SELECT COUNT(name) FROM grp_tb GROUP BY id;
    
    EXPR1 | 
    ------------------------------------------------------------------------------
    2 |
    1 |
  • 示例2
    GROUP BY指定字段在返回列表字段中。

    sql
    SQL> SELECT COUNT(name),id FROM grp_tb GROUP BY id;
    
    EXPR1 | ID | 
    ------------------------------------------------------------------------------
    2 | 1 |
    1 | 2 |
  • 示例3
    GROUP BY的三种扩展方式。

    sql
    SQL> CREATE TABLE tb_grp3(id INT PRIMARY KEY,name VARCHAR(15),department VARCHAR(10),salary NUMBER(8, 2),gender VARCHAR(10));
    
    SQL> INSERT INTO tb_grp3 VALUES (1001, 'John', 'IT', 35000, 'Male');
    INSERT INTO tb_grp3 VALUES (1002, 'Smith', 'HR', 45000, 'Male');
    INSERT INTO tb_grp3 VALUES (1003, 'James', 'Finance', 50000, 'Male');
    INSERT INTO tb_grp3 VALUES (1004, 'Mike', 'Finance', 50000, 'Male');
    INSERT INTO tb_grp3 VALUES (1005, 'Linda', 'HR', 75000, 'Female');
    INSERT INTO tb_grp3 VALUES (1006, 'Anurag', 'IT', 35000, 'Male');
    INSERT INTO tb_grp3 VALUES (1007, 'Priyanla', 'HR', 45000, 'Female');
    INSERT INTO tb_grp3 VALUES (1008, 'Sambit', 'IT', 55000, 'Female');
    INSERT INTO tb_grp3 VALUES (1009, 'Pranaya', 'IT', 57000, 'Female');
    INSERT INTO tb_grp3 VALUES (1010, 'Hina', 'HR', 75000, 'Male');
    INSERT INTO tb_grp3 VALUES (1011, 'Warner', 'Finance', 55000, 'Female');
    -- 仅GROUP BY
    SQL> SELECT department,gender,COUNT(*) group_cou FROM tb_grp3 GROUP BY(department,gender);
    
    DEPARTMENT | GENDER | GROUP_COU |
    ------------------------------------------------------------------------------
    Finance| Female| 1 |
    Finance| Male| 2 |
    HR| Female| 2 |
    HR| Male| 2 |
    IT| Female| 2 |
    IT| Male| 2 |
    
    -- ROLLUP
    SQL> SELECT department,gender,COUNT(*) rollup_cou FROM tb_grp3 GROUP BY ROLLUP(department,gender);
    
    DEPARTMENT | GENDER | ROLLUP_COU |
    ------------------------------------------------------------------------------
    Finance| Female| 1 |
    Finance| <NULL>| 3 |
    Finance| Male| 2 |
    HR| Female| 2 |
    HR| <NULL>| 4 |
    HR| Male| 2 |
    IT| Female| 2 |
    <NULL>| <NULL>| 11 |
    IT| <NULL>| 4 |
    IT| Male| 2 |
    
    -- CUBE
    SQL> SELECT department,gender,COUNT(*) cube_cou FROM tb_grp3 GROUP BY CUBE(department,gender);
    
    DEPARTMENT | GENDER | CUBE_COU |
    ------------------------------------------------------------------------------
    Finance| Female| 1 |
    Finance| <NULL>| 3 |
    Finance| Male| 2 |
    HR| Female| 2 |
    HR| <NULL>| 4 |
    HR| Male| 2 |
    IT| Female| 2 |
    <NULL>| <NULL>| 11 |
    IT| <NULL>| 4 |
    IT| Male| 2 |
    <NULL>| Female| 5 |
    <NULL>| Male| 6 |
    
    -- GROUPING SETS
    SQL> SELECT department,gender,COUNT(*) group_set_cou FROM tb_grp3 GROUP BY GROUPING SETS(department,gender);
    
    DEPARTMENT | GENDER | GROUP_SET_COU |
    ------------------------------------------------------------------------------
    Finance| <NULL>| 3 |
    HR| <NULL>| 4 |
    IT| <NULL>| 4 |
    <NULL>| Female| 5 |
    <NULL>| Male| 6 |