SQL笔试题

Posted by 道行尚浅 on January 20, 2018

用一条sql语句查出员工工资表所有信息,工资最高的前三条信息按升序排在最前面, 其余的按原顺序排列

原始数据如下


SQL> select * from scott.emp ;
EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
 7369 SMITH      CLERK      7902 1980/12/17     800.00               20
 7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
 7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
 7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
 7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
 7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
 7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
 7839 KING       PRESIDENT       1981/11/17    5000.00               10
 7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
 7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
 7900 JAMES      CLERK      7698 1981/12/3      950.00               30
 7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
 7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
14 rows selected

答案


SQL> select (case
  2           when sal_rn >= 4 then
  3            0
  4           else
  5            sal_rn
  6         end) xxxx,  --只保留工资最高的三个人的排序序号,其他都修改为相同的数字0 由于后面使用降序排列,修改为0能保证其他行在下面,并且按照原来rownum排序
  7         e.*
  8    from (select rownum sal_rn, --按照工资降序排列的顺序
  9                 e.*
 10            from (select rownum yuan_rn,  --保留rownum及保存原顺序
 11                   e.* from scott.emp e order by sal desc) e) e
 12   order by xxxx desc, yuan_rn
 13  ;
      XXXX     SAL_RN    YUAN_RN EMPNO ENAME      JOB         MGR HIREDATE          SAL      COMM DEPTNO
---------- ---------- ---------- ----- ---------- --------- ----- ----------- --------- --------- ------
         3          3          8  7788 SCOTT      ANALYST    7566 1987/4/19     3000.00               20
         2          2         13  7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
         1          1          9  7839 KING       PRESIDENT       1981/11/17    5000.00               10
         0         14          1  7369 SMITH      CLERK      7902 1980/12/17     800.00               20
         0          7          2  7499 ALLEN      SALESMAN   7698 1981/2/20     1600.00    300.00     30
         0         10          3  7521 WARD       SALESMAN   7698 1981/2/22     1250.00    500.00     30
         0          4          4  7566 JONES      MANAGER    7839 1981/4/2      2975.00               20
         0         11          5  7654 MARTIN     SALESMAN   7698 1981/9/28     1250.00   1400.00     30
         0          5          6  7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
         0          6          7  7782 CLARK      MANAGER    7839 1981/6/9      2450.00               10
         0          8         10  7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
         0         12         11  7876 ADAMS      CLERK      7788 1987/5/23     1100.00               20
         0         13         12  7900 JAMES      CLERK      7698 1981/12/3      950.00               30
         0          9         14  7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
14 rows selected