繁体   English   中英

我想查询第一和第二高工资之间的差异

[英]I want to query difference between first and second highest salary

我已经拿到了第二高的薪水。

我想显示:员工姓名、薪水、部门名称,以及最高和次高薪水之间的差异。

这是我当前的代码。

select  max(SAL) SecondHighestSalary 
from EMP A, DEPT B
where SAL < (
  select max(A.SAL)
  from EMP A, DEPT B
  where A.DEPTNO = B.DEPTNO and B.LOC = 'New York'
);

谢谢

使用DENSE_RANK (如果您想要最高的两个唯一工资值)或ROW_NUMBER (如果您想要两个收入最高的人的工资而不管关系如何)分析函数,然后使用条件聚合:

SELECT MAX( CASE WHEN sal_rank = 1 THEN sal END )
         - MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
       MAX( CASE WHEN sal_rownum = 1 THEN sal END )
         - MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM   (
  SELECT e.deptno,
         e.sal,
         DENSE_RANK() OVER ( ORDER BY e.sal DESC ) AS sal_rank,
         ROW_NUMBER() OVER ( ORDER BY e.sal DESC ) AS sal_rownum
  FROM   emp e
         INNER JOIN dept d
         ON ( e.deptno = d.deptno )
  WHERE  d.loc = 'New York'
);

其中,对于样本数据:

CREATE TABLE emp ( deptno, sal ) AS
SELECT 1, 2000 FROM DUAL UNION ALL
SELECT 1, 2000 FROM DUAL UNION ALL
SELECT 1, 1000 FROM DUAL UNION ALL
SELECT 1,  500 FROM DUAL UNION ALL
SELECT 1,  200 FROM DUAL UNION ALL
SELECT 2, 2000 FROM DUAL UNION ALL
SELECT 2, 1500 FROM DUAL UNION ALL
SELECT 2,  200 FROM DUAL UNION ALL
SELECT 2,  700 FROM DUAL;

CREATE TABLE dept ( deptno, loc ) AS
SELECT 1, 'New York' FROM DUAL UNION ALL
SELECT 2, 'Beijing'  FROM DUAL;

输出:

\n SAL_DIFFERENCE_IGNORE_TIES |  SAL_DIFFERENCE_WITH_TIES\n -------------------------: |  -----------------------:\n                       1000 |  0\n

或者,如果您想要所有部门:

SELECT deptno,
       MAX( CASE WHEN sal_rank = 1 THEN sal END )
         - MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
       MAX( CASE WHEN sal_rownum = 1 THEN sal END )
         - MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM   (
  SELECT e.deptno,
         e.sal,
         DENSE_RANK() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rank,
         ROW_NUMBER() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rownum
  FROM   emp e
         INNER JOIN dept d
         ON ( e.deptno = d.deptno )
)
GROUP BY deptno;SELECT deptno,
       MAX( CASE WHEN sal_rank = 1 THEN sal END )
         - MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
       MAX( CASE WHEN sal_rownum = 1 THEN sal END )
         - MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM   (
  SELECT e.deptno,
         e.sal,
         DENSE_RANK() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rank,
         ROW_NUMBER() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rownum
  FROM   emp e
         INNER JOIN dept d
         ON ( e.deptno = d.deptno )
)
GROUP BY deptno;

哪些输出:

\n德普诺 |  SAL_DIFFERENCE_IGNORE_TIES |  SAL_DIFFERENCE_WITH_TIES\n -----: |  -------------------------: |  -----------------------:\n      1 |  1000 |  0\n      2 |  500 |  500\n

db<> 在这里摆弄

这个怎么样?

基于 Scott 的 EMP 表:

SQL> select ename, sal
  2  from emp
  3  order by sal desc;

ENAME             SAL
---------- ----------
KING             5001       --> highest salary
FORD             3000       --> Ford and Scott share the 
SCOTT            3000       --> 2nd highest salary
JONES            2975
BLAKE            2850
CLARK            2450
ALLEN            1600
TURNER           1500
MILLER           1300
WARD             1250
MARTIN           1250
ADAMS            1100
SMITH            1000
JAMES             950

14 rows selected.

然后你对他们进行排名并 - 使用LISTAGG (显示共享相同最高或第二高工资的所有员工) - 得到最终结果:

SQL> with temp as
  2    (select e.ename,
  3            e.sal,
  4            dense_rank() over (order by e.sal desc) rnk,
  5            d.dname
  6     from emp e join dept d on d.deptno = e.deptno
  7    )
  8  select listagg(case when rnk = 1 then ename ||' - '|| dname || ' ($' || sal ||')' end, ', ')
  9           within group (order by ename) highest,
 10         --
 11         listagg(case when rnk = 2 then ename ||' - '|| dname || ' ($' || sal ||')' end, ', ')
 12           within group (order by ename) second_highest,
 13         --
 14         max(case when rnk = 1 then sal end) -
 15         max(case when rnk = 2 then sal end) diff
 16  from temp t
 17  where t.rnk in (1, 2);

HIGHEST                        SECOND_HIGHEST                                           DIFF
------------------------------ -------------------------------------------------- ----------
KING - ACCOUNTING ($5001)      FORD - RESEARCH ($3000), SCOTT - RESEARCH ($3000)        2001

SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM