Oracle分组统计

---------------------------------------------------Oracle分组统计---------------------------------------------------------

分组统计需要使用GROUP BY来分组

语法:语法:SELECT * |列名FROM 表名 {WEHRE 查询条件}   {GROUP BY 分组字段,分组字段1…} ORDERBY 列名1 ASC|DESC,列名2...ASC|DESC

范例:查询每个部门的人数

范例:查询出每个部门的平均工资

 

如果我们想查询出来部门编号,和部门下的人数

我们发现报了一个ORA-00937的错误

注意:

1.    如果使用分组函数,SQL只可以把GOURPBY分组条件字段和分组函数查询出来,不能有其他字段。

2.    如果使用分组函数,不使用GROUP BY 只可以查询出来分组函数的值

 

范例:按部门分组,查询出部门名称和部门的员工数量

 

范例:查询出部门人数大于5人的部门

分析:需要给count(ename)加条件,此时在本查询中不能使用where,可以使用HAVING

Having在group by 后面作用在分组函数上

范例:查询出部门平均工资大于2000的部门

范例:显示非销售人员工作名称以及从事同一工作的员工的月工资的总和,并且要满足从事同一工作月工资总和大于5000,结果按月工资总和的升序排列。

分析:

1.    查询出非销售人员

2.    以步骤1为基础按着工作分组求工资的总和

3.    以步骤2为基础查询出月工资总和大于5000的工作

4.    按着月工资的总和的升序排列

注意:只有分组条件在结果集中是重复的分组才有意义。

代码示例:

select count(deptno), deptno from emp group by deptno order by deptno asc; --分组统计人数

 

select avg(sal) salavg, deptno from emp group by deptno; --求出各个部门的平均工资

 

/* 会报错,因为没有group by分组所以统计函数统计的是整张表的数据

   我们却非要强加在部门编号上是不对的,所以想要查询出来部门下的统计信息必须要分组

   --   14, 30

   --       20

   --       10 */

select count(*), deptno from emp;

 

select count(*), d.deptno,d.dname, d.loc from emp e, dept d where e.deptno=d.deptno group by d.deptno, d.dname,d.loc; --查询各部门人数和各部门名称

 

select count(*),deptno,job,ename from emp group by deptno,job,ename order by deptno;  --查询各部门中每一个人,

 

 --查询人数大于5的部门,having分组条件查询不能使用别名

select count(*), d.deptno,d.dname, d.loc from emp e, dept d where e.deptno=d.deptno group by d.deptno, d.dname,d.loc having count(*)>5;

 

--查询部门平均工资大于2000

select avg(sal), deptno from emp group by deptno having avg(sal) > 2000;

select avg(sal) avgsal, deptno from emp where deptno <> 20 group by deptno;

 

--范例:显示非销售人员工作名称以及从事同一工作的员工的月工资的总和,并且要满足从事同一工作月工资总和大于5000,结果按月工资总和的升序排列。

select sum(sal), e.job

  from emp e

 where e.job <> 'SALESMAN'

 group by e.job

having sum(sal) > 5000

 order by sum(sal);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值