SQL grouping sets 子句

来源:互联网 发布:linux node.js 安装xz 编辑:程序博客网 时间:2024/05/01 21:05
grouping sets子句允许你指定多个group by 选项。增强了group by 的功能。
可以通过一条select 语句实现复杂繁琐的多条select 语句的查询。并且更加的
高效,解析存储一条SQL于语句。下面通过使用grouping sets 子句与没有
使用grouping sets 子句来对比学习该子句。
查询每个部门的每类工作的平均工资,使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by grouping sets ((department_id,job_id));
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
          110 AC_ACCOUNT        8300
           80 SA_REP         7909.09091
           90 AD_VP                  17000
           50 ST_CLERK               2785
          110 AC_MGR              12000
           50 ST_MAN                 7280
           80 SA_MAN              12200
           50 SH_CLERK              3215
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by department_id,job_id;
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
          110 AC_ACCOUNT        8300
           80 SA_REP          7909.09091
           90 AD_VP                   17000
           50 ST_CLERK                2785
          110 AC_MGR               12000
           50 ST_MAN                 7280
           80 SA_MAN              12200
           50 SH_CLERK             3215
再查询每个部门每类工作平均工资的基础上,还要查询出每个部门的平均工资。使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by grouping sets ((department_id,job_id),department_id);
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
           10 AD_ASST              4400#每个部门每类工作的平均工资。
           10                              4400#每个部门的平均工资。
           20 MK_MAN           13000
           20 MK_REP               6000
           20                             9500
           30 PU_MAN           11000
           30 PU_CLERK           2780
           30                             4150
           40 HR_REP               6500
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by (department_id,job_id)
  4  union
  5  select department_id,null,avg(salary)
  6  from hr.employees
  7  group by department_id;
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
           10 AD_ASST              4400
           10                              4400
           20 MK_MAN           13000
           20 MK_REP               6000
           20                             9500
           30 PU_CLERK           2780
           30 PU_MAN           11000
           30                             4150
           40 HR_REP               6500

SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by grouping sets ((department_id,job_id),department_id,());
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
           10 AD_ASST              4400
           10                              4400
           20 MK_MAN           13000
           20 MK_REP               6000
           20                             9500
           30 PU_MAN           11000
           30 PU_CLERK          2780
再查询每个部门每类工作平均工资与查询出每个部门的平均工资的基础上,还要查询整个企业中雇员的平均工资。使用grouping sets的语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by grouping sets ((department_id,job_id),department_id,()); #() 表示做一个整体的聚集。
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
           10 AD_ASST              4400
           10                              4400
           20 MK_MAN           13000
           20 MK_REP               6000
           20                             9500
           30 PU_MAN           11000
           30 PU_CLERK           2780
                                              。
                                              。
                                              。
                                 6380.90909 #这一行查询的是整个employees 中雇员总的平均工资。
没有使用grouping sets 的对等语句。
SQL> select department_id,job_id,avg(salary)
  2  from hr.employees
  3  group by (department_id,job_id)
  4  union
  5  select department_id,null,avg(salary)
  6  from hr.employees
  7  group by department_id
  8  union 
  9  select null,null,avg(salary)
 10  from hr.employees;
DEPARTMENT_ID JOB_ID     AVG(SALARY)
------------- ---------- -----------
           10 AD_ASST              4400
           10                              4400
           20 MK_MAN           13000
           20 MK_REP               6000
           20                              9500
           30 PU_CLERK            2780
           30 PU_MAN           11000
           30                             4150
           40 HR_REP               6500
                                              。
                                              。
                                              。
                                6380.90909 #这一行查询的是整个employees 中雇员总的平均工资。

1 0
原创粉丝点击