Oracle分组函数以及数据分组
简单总结一下对于数据的分组和分组函数。
本文所举实例,数据来源oracle用户scott下的emp,dept ,salgrade 3表:数据如下:



一、分组函数
1、sum()求和函数、max()求最大值函数、min()求最小值函数、avg()求平均值函数、count()求总行数函数
Expression: sum(column)、max(cloumn)、min(cloumn)、avg(column)、count(column) 其中column都是字段名称
Example:
select avg(sal),max(sal),min(sal),sum(sal),count(sal) from emp;

2、distinct关键字:英译有区别的,用于对同一个列去除重复值: Expression: dinsticnt(column)
Example:
select distinct deptno from emp;

3、wm_concat函数:行转列函数,将列值以逗号作为分割显示在一行的函数。 Expression(column)
Example:
select wm_concat(ename) from emp;

二、数据分组
1、group by分组子句:和分组函数结合使用,对其他条件进行分组,如求每个部门的平均工资,平均工资用分组函数avg,每个部门则需用group by 分组
Example:
select deptno,avg(sal) from emp group by deptno;

注意:group by字句中的条件必须是所有的除了分组以外的所有列才不会出错,并且必须和分组函数结合使用否则没有分组的意义,并且会报错。
2、having 子句:如果查询条件中有分组函数,此时不能使用where子句,替换为having子句,用于对分组后的结果进行过滤。
Example:

可以看出where子句不允许使用分组函数
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

三、经典实例分析:
1、求部门平均薪水的等级和求部门平均的薪水等级。
这里多用到一个薪水等级的表salgrade:

select deptno,avg_sal,grade from (select deptno,avg(sal) avg_sal from emp group by deptno) a join salgrade on
(a.avg_sal between losal and hisal);

解析:第一问:由问题可知需要求三个值,deptno,avg_sa,grade,求解的是平均薪水的等级,那么先求部门的平均薪水,用分组函数和group_by子句,分组条件很明显deptno,将此结果看做一个新表a,其中可以查询到deptno和avg_sal,接下来还有一个等级需要求解,直接join表salgrade,条件也很明显,平均工资在低工资和高工资之间就可以了,加入条件后即可查询出对应的grade等级
select deptno,avg(grade) from (select deptno,grade from emp e join salgrade on e.sal between losal and hisal) group by deptno;

第二问:由题意分析出需要求解2个值deptno,avg(grade),平均 的薪水等级重心是等级,划分为小问题先求解每个员工薪水等级,从emp表联合salgrade表查询,条件是每个员工工资在losal和hisal之间,这样就求出了部门号和每个员工的工资等级,那么再求平均等级只需要avg函数,又题目求得是每个部门的工资等级,只需要分组即可,分组条件deptno。
注:此类题型注重对问题的解读,分析出求解几个值,再使用传统思路将大问题划分为若干小问题,由小及大解决即可。
2018-08-10 09:27:27
Oracle分组函数以及数据分组的更多相关文章
- MySQL聚合函数与数据分组
我们最常需要的是汇总数据而不是把他们实际检索出来 确定表中行数(或满足某个条件或包含某个特定值的行数) 确定表中行组的和 找出表列(或所有行或特定列)的最大值,最小值和平均值 聚集函数是运行在行组上, ...
- oracle wm_concat函数 列转行 分组函数
(1)select mark, wm_concat(status) from DISSENT_INFO t GROUP BY mark; 查出来的数据 mark status 222 ...
- Oracle 分组函数
分组函数的介绍 分组函数作用于一组数据,并对一组数据返回一个值. (引用网上的一张图) 分组函数的使用规则 SELECT [column,] group_function(column) FROM t ...
- Oracle学习笔记_05_分组函数
组函数:avg sum max min count group by having group by 增强:rollup cube grouping groupi ...
- mysql基础教程(二)-----分组函数、多表查询、常见函数
分组函数 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值. 组函数类型 • AVG() • COUNT() • MAX() • MIN() • SUM() 组函数语法 AVG(平均值) ...
- Oracle_SQL函数-分组函数
分组函数 什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值 组函数类型:主要有6种 AVG - 平均 COUNT - 计数 MAX - 最大 MIN - 最小 SUM - 求和 STDD ...
- mysql分组函数与查询
Ⅰ.分组函数的分类: max():最大值 min():最小值 sum():和 avg():平均值 count():计算非空的个数 这些都是通用的,sqlserver.oracle.mysql都是一样的 ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数
花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...
随机推荐
- Objective-c:NSFileHandle类,创建流对象,对文件进行写入、读取的操作
NSFileHandle类:它需要配合NSFileManager文件管理类,对文件内容进行操作,写入数据.读取数据. 使用步骤: 1.打开文件获取NSFileHandle类的对象 2. ...
- Javascript中的Array(数组) 、{}(映射) 与JSON解析
做网页总会使用javascript,使用javascript总会使用JSON.最近用到一下,就写写. 下面是总结: 1.将javascript中的Array和{}转化为json字符串可以使用json2 ...
- atoi(),atof等函数的实现
atoi()函数的功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回( ...
- CSS 的优先级机制总结
一.样式优先级: 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况下,大家都认为优先级是:内联样式 > 内部样 ...
- js 特效
栏目1 栏目1->菜单1 栏目1->菜单2 栏目1->菜单3 栏目1->菜单4 栏目2 栏目2->菜单1 栏目2->菜单2 栏目2->菜单3 栏目2-> ...
- [CSS] Collapsing Margins
Refactor the spacing between <header>, <article>, and <aside> so that elements wil ...
- sed 常用的功能
1.每行后面加入一个空行 sed 'G' num.txt,保留空间(Hold Space)的内容默认值是一个空行.2.每行前面加入一个空行 sed '{x;p;x}' num.txt,交换模式空间和保 ...
- listView/GridView getChild获取不到的解决方法
在onCreate或onResume中调用了getChildAt()方法,这时候adapter中的Item还没有放入到AdapterView中去.... 解决方法,当activity获得焦点事件的时候 ...
- redis常用命令记录
cd App/opt/redis/bin/ ./redis-cli 1.查看所有key值 keys 前缀* 2.删除指定key值 删除一条 del key全名 删除多条 exit ./redis-cl ...
- 动态设置js的属性
目标:js的属性名能够使用变量 举例:js对象object,当赋给该对象属性的时候能够採用下面方式 var object; object.prop1 = "value1"; obj ...