Oracle高级查询之GROUP BY

对于group by 的方式不再累赘,高级方式如下案例。

参考老师文章:http://blog.csdn.net/fu0208/article/details/7183258,向老师致敬,辛苦了

为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。所用emp表,

如果没有此表请参考文章:http://blog.csdn.net/xiaokui_wingfly/article/details/43957003中拷贝

现在客户的需求是统计部门中每种工作的工资总额,最后还需要统计所有人的工资总数,相信这样的需求对大家来说还是比较简单的,很快就能写出SQL语句,如下:

  select * from (select deptno, job, sum(sal) from emp group by deptno, job order by deptno)
union all
  select null deptno, null job, sum(sal) from emp;

客户拍了一下脑袋瓜(当成西瓜拍了),再统计每个部门的工资数吧。tnnd,我加一个union all搞定,修改后的SQL语句如下:

----统计部门中每种工作的工资总额 , 还需要统计每个部门的工资数和统计所有人的工资总数
  select * from (select deptno, job, sum(sal) from emp group by deptno, job order by deptno)
union all
  select * from (select deptno, null job, sum(sal) from emp group by deptno order by deptno)
union all
  select null deptno, null job, sum(sal) from emp;

其实还有一种简单的方式可以实现,如下函数 group by rollup(...)

select deptno, job, sum(sal) 工资 from emp group by rollup(deptno, job); 

客户的需求就好像肾虚的人尿频一样(谁说客户是上帝,上帝哪来那么多的需求?),再统计每个工作类型的工资总额吧。tnnd,我再加一个union all再搞定,修改后的SQL语句如下:

----统计部门中每种工作的工资总额 , 还需要统计所有人的工资总数和统计每个部门的工资数,再统计每个工作类型的工资总额
  select * from (select deptno, job, sum(sal) from emp  group by deptno, job order by deptno)
union all
  select * from (select deptno, null job, sum(sal) from emp group by deptno order by deptno)
union all
  select null deptno, job, sum(sal)  from emp group by job
union all
  select null deptno, null job, sum(sal) from emp;

上面的方法还可以使用简单函数方法实现,修改sql如下

select grouping(job),deptno, job, sum(sal) from emp group by cube(deptno, job) order by deptno;  
select deptno, job, sum(sal) from emp group by cube(deptno, job) order by deptno; -- 简化上面代码

客户想了想说,只要统计部门工资总额和工作类型工资总额就可以了(我每天都徘徊在杀人和忍住不杀之间),我fucking减掉一个union all搞定,修改后的SQL语句如下:

-- 统计工作类型工资总额和部门工资总额
  select null deptno, job, sum(sal) from emp group by job
union all
  select deptno, null job, sum(sal) from emp group by deptno;

莫慌,这里还有一个大招,修改代码如下

select grouping(job), grouping_id(job), grouping(deptno), deptno, job, sum(sal) from emp group by grouping sets(deptno, job);

忙活半天总算把客户的需求都满足了,稍微松了一口气,不过既然学到新东西,我们有必要最后总结一下。

GROUP BY ROLLUP(A,B,C):首先对(A,B,C)进行GROUP BY,然后对(A,B)进行GROUP BY,然后是(A)进行GROUP BY, 最后对全表进行GROUP BY操作。

GROUP BY CUBE(A,B,C):首先对(A,B,C)进行GROUP BY,然后依次对(A,B)、(A,C)、(A)、(B,C)、(B)、(C)进行GROUP BY,最后对全表进行GROUP BY操作。

GROUP BY GROUPING SETS(A,B,C):依次对(C)、(B)、(A)进行GROUP BY。

对此三个函数详细使用方式参考文章:http://www.2cto.com/database/201204/127014.html

时间: 2024-08-08 09:26:36

Oracle高级查询之GROUP BY的相关文章

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------

Oracle 高级查询

Oracle SQL 一些函数用法 以下sql环境都是在 Oracle 11g/scott完成 Group by 与GROUP BY一起使用的关建字 GROUPING,GROUP SET,ROLLUP,CUBE结合这些特性的函数可以实现SQL的明细+分组统计 GROUPING GROUPING 记录是对哪个字段进行统计,其值只能是 0 & 1 Group(column) =0 表示此字段参与了分组统计 =1表示字段未参与分组统计 select deptno,job,sum(sal),groupi

Oracle 高级查询1 关联查询 分组查询

高级查询 1.关联查询作用:可以跨越多表查询 --查询出员工的名字和他所在部门的的名字 语法:select 列,列,列 from 表1 join 表2on 表1外键=表2主键 2.外联接 左外联[left outer join] 以关联的左边为准,即使右边没有与之匹配的记录,则左边的记录也要 出现在结果集中,右边全部以NULL值显示. 右外联[right outer join] 以关联的右边为准,即使左边没有与之匹配的记录,则右边的记录也要 出现在结果集中,左边全部以NULL值显示. 3分组查询

Oracle高级查询之over(partition by...)

为了方便学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. [sql] view plain copy print? create table EMP ( empno    NUMBER(4) not null, ename    VARCHAR2(10), job      VARCHAR2(9), mgr      NUMBER(4), hiredate DATE, sal      NUMBER(7,2), comm     NUMBER(7,2), deptno   N

Oracle高级查询之CONNECT BY

为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的. Oracle中的select语句可以用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: select ... from where <过滤条件,用于对返回的所有记录进行过滤>start with <根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树>connect by [prior

Oracle高级查询

本章将学习的内容有: 如何使用集合操作符,集合操作符用于将两个或多个查询返回的行组合起来 使用TRANSLATE函数 1.使用集合操作符 操作符 说明 UNION ALL 返回各个查询检索出的所有行,包括重复行 UNION 返回各个查询检索出的所有行,不包括重复行 INTERSECT 返回两个检索锁的共有行 MINUS 返回将第二个查询检索出的行从第一个查询检索的行中去除之后的行 注意:当使用集合操作符的时候,必须牢记这样一条限制:所有查询返回的列数以及列的类型必须匹配,但列名可以不同. 使用I

MongoDB学习--高级查询 [聚合Group]

Group大约需要一下几个参数. key:用来分组文档的字段.和keyf两者必须有一个 keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 initial:reduce中使用变量的初始化 reduce:执行的reduce函数.函数需要返回值. cond:执行过滤的条件. finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数.可选的 测试数据 //测试的数据 db.stocks.insert({"day": &

oracle数据库的高级查询方法 多表联合查询

oracle查询 一,简单查询 order by 1,2 select t.sno, t.sname, t.ssex from STUDENT t order by 1,2,3 group by 增强版 SELECT p.toma, p.ptype, SUM(p.lastcou) FROM product p GROUP BY rollup(p.toma, p.ptype) 二,高级查询(多表连接查询) 笛卡尔积的概念: 所谓笛卡尔积,通俗点说就是指包含两个集合中任意取出两个元素构成的组合的集合

07-Hive高级查询order by、group by

声明:未经本人允许,不得转载哦! 哈喽,大家好.这两天就要高考了,我原本是一名物理老师,这一届初高中的学生带完,估计就要开始找大数据岗位的工作了.目前掌握的是技能有java+linux++mysql+hadoop+hive+hbase,正在学习的是shell,计划2016年接着要学习的是scala+spark.祝我好运吧. 今天我们一起来学习的是[Hive高级查询group.order语法].话不多说,咱们开始吧. 1 Hive的高级查询操作有很多,主要有: group by #按K来把数据进行