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);

 

Oracle数据库中,分组统计数量并计算总数可以通过以下方式实现: ### 基本的分组统计数量 使用`GROUP BY`子句结合`COUNT()`函数可以对数据进行分组统计数量。例如,要统计学生表中每个姓名出现的次数,可以使用以下语句: ```sql select s.name, count(*) from student s group by s.name; ``` 此语句从`student`表中按照学生姓名进行分组,并统计每个姓名对应的记录数量。 ### 结合多表进行分组统计数量 分组统计可以和多表查询一起使用。例如,查询学生表`id`和老师表`sid`相同的学生姓名,并统计数量按照学生姓名分组: ```sql select s.name, count(*) from student s, teacher t where s.id = t.sid group by s.name; ``` 该语句通过连接`student`表和`teacher`表,根据学生姓名分组统计满足`id`和`sid`相等条件下每个学生姓名的记录数量 [^2]。 ### 分组统计数量并过滤结果 可以使用`HAVING`子句对分组后的结果进行过滤。例如,查询所有非销售人员的工资总和,并且要求满足同一工作的雇员的工资总和大于5000,显示结果按照工资的总和由高到低排序: ```sql select job, sum(sal) from emp where job!='SALESMAN' group by job having sum(sal) > 5000 order by sum(sal) desc; ``` 此语句先筛选出非销售人员的数据,然后按照工作进行分组,计算每组的工资总和,使用`HAVING`子句过滤出工资总和大于5000的组,最后按照工资总和降序排列 [^1]。 ### 使用`GROUPING()`函数辅助统计 `GROUPING()`函数可以产生一个附加的列,当用`CUBE`或`ROLLUP`运算符添加行时,附加的列输出值为1,当所添加的行不是由`CUBE`或`ROLLUP`产生时,附加列值为0。例如: ```sql SELECT job, GROUPING(job), COUNT(*) FROM emp GROUP BY ROLLUP(job); ``` 该语句会按照工作进行分组统计数量,同时使用`ROLLUP`运算符添加汇总行,`GROUPING(job)`会在汇总行时返回1,普通分组行返回0 [^4]。 ### 计算总数 如果要在分组统计的同时计算所有记录的总数,可以使用`WITH`子句结合子查询来实现。例如: ```sql WITH grouped_data AS ( select s.name, count(*) as group_count from student s group by s.name ) SELECT name, group_count, (SELECT COUNT(*) FROM student) as total_count FROM grouped_data; ``` 此语句先将分组统计的结果存储在`grouped_data`临时结果集中,然后在主查询中查询分组统计结果,并通过子查询计算学生表的记录总数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值