目录
[显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列](#显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列)
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
显示所有非销售人员的工作名称以及计算出从事同一工作的员工的月工资总和,并且筛选出从事同一工作的员工的月工资总和大于 500 的工作名称,显示的结果按照月工资总和进行升序排列
第一步:查询所有非销售人员的信息,使用 where子句进行限定查询
sql
SQL> select *
2 from emp
3 where job<>'SALESMAN';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- ------------------ ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择 8 行。
第二步:按照职位进行分组,而后求出月工资的总支出
sql
SQL> select job,sum(sal)
2 from emp
3 where job<>'SALESMAN'
4 group by job;
JOB SUM(SAL)
------------------ ----------
CLERK 3050
ANALYST 3000
MANAGER 8275
PRESIDENT 5000
第三步:分组后的数据进行再次的筛选,使用 HAVING 子句
sql
SQL> select job,sum(sal)
2 from emp
3 where job<>'SALESMAN'
4 group by job
5 having sum(sal)>5000;
JOB SUM(SAL)
------------------ ----------
MANAGER 8275
第四步:按照月工资的合计进行升序排列,使用 order by 子句
sql
SQL> select job,sum(sal) sum
2 from emp
3 where job<>'SALESMAN'
4 group by job
5 having sum(sal)>5000
6 order by sum;
JOB SUM
------------------ ----------
MANAGER 8275
我这儿只有一行,但是可能有些朋友数据不一样,我还是写一下吧
统计所有领取佣金和不领取佣金的人数、平均工资
按照简单的思维模式,可以使用 com 分组
sql
SQL> select comm,count(*),avg(sal)
2 from emp
3 group by comm;
COMM COUNT(*) AVG(SAL)
---------- ---------- ----------
300 1 1600
1400 1 1250
9 2415.625
500 1 1250
0 1 1500
使用 group by 的时候会把每一个种子值当做一个分组,所以此时不可能直接使用 GROUP BY
那么现在可以换一个思路,把问题拆分一下
查询出所有领取佣金的员工的人数、平均工资。直接使用 where子句,不使用 group by
sql
SQL> select '领取佣金' info ,count(*),avg(sal)
2 from emp
3 where comm is not null;
INFO COUNT(*) AVG(SAL)
------------------------ ---------- ----------
领取佣金 4 1400
查询出所有不领取佣金的员工的人数、平均工资。直接使用 where子句,不使用 group by
sql
SQL> select '不领取佣金' info ,count(*),avg(sal)
2 from emp
3 where comm is null;
INFO COUNT(*) AVG(SAL)
------------------------------ ---------- ----------
不领取佣金 9 2415.625
既然此时两个查询结果返回的结构完全相同,那么直接连接即可
sql
SQL> select '领取佣金' info ,count(*),avg(sal)
2 from emp
3 where comm is not null
4 union
5 select '领取佣金' info ,count(*),avg(sal)
6 from emp
7 where comm is null;
INFO COUNT(*) AVG(SAL)
------------------------ ---------- ----------
领取佣金 4 1400
领取佣金 9 2415.625
说明并不是什么时候都要使用分组统计函数,要根据具体要求灵活使用
注意事项
(1)hroup by 子句经常和统计函数一起使用,在一起使用的时候,如果 select 语句中包含统 计函数,则计算每组的汇总值。
(2)Having 子句对 group by 子句选择出来的结果进行二次筛选,最后输出符合 having 子句中条件的记录。
(3)Havinh子句与 where 子句的语法类型,二者不同之处在于 having子句可以包含统计函数。