如何找出工资前三名的雇员

Posted ddzj01

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何找出工资前三名的雇员相关的知识,希望对你有一定的参考价值。

提问:如何找出工资前三名的雇员。(工资可能为空,也可能出现重复)
以表emp为例子:
     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20
      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20
      7900 JAMES      CLERK           7698 03-DEC-81        950                    30
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

第一种方法为我的笨方法:

select *
from emp
where sal >= (select sal
from (select sal, rownum rn
from (select distinct sal from emp order by sal desc))
where rn = 3) order by sal desc;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

第二种为网上找的,自己稍加改造:

select *
from emp e1
where (select count(distinct sal) from emp e2 where e2.sal >= e1.sal) <= 3
order by sal desc;


     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7839 KING       PRESIDENT            17-NOV-81       5000                    10
      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20
      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

总结:明显第二种方法所写的代码量以及嵌套的层数,都要比第一种好。
后记:以后坚持写写心得什么之类的,学学大神们。

以上是关于如何找出工资前三名的雇员的主要内容,如果未能解决你的问题,请参考以下文章

只要工资不少加不加薪都不重要

如何用oracle查询出部门名称,部门员工数,部门平均工资,部门最低工资雇员的姓名,及工资等级

oracle 分组查询 子查询 统计查询 FROM加子查询临时表 查询高于平均工资 示例代码

LeetCode(数据库)- 将工资相同的雇员分组

洛谷 P1407 工资

如何使用laravel 5中的员工数据计算员工的总工资?