如何使用BREAK和COMPUTE SUM在deptno(deptno 10,20,30)上的EMP表上获得两个最高工资?

时间:2016-02-04 09:45:09

标签: sql oracle highest

这是我的代码:

BREAK ON DEPTNO SKIP 1
compute sum of sal on deptno
SELECT  deptno, empno, ename,sal FROM
(SELECT  deptno, empno, ename, sal FROM emp group by deptno, empno, ename, sal  order by DEPTNO)
  WHERE   ROWNUM <= 2;

但结果是:

    DEPTNO      EMPNO ENAME             SAL
---------- ---------- ---------- ----------
        10       7782 CLARK            2450
                 7839 KING             5000
**********                       ----------
sum                                    7450

什么是好的,但是我想在deptno 20,deptno 30上得到它: (这是预期的结果,所有都在同一回报中 - 对于deptno 10,20,30)

    DEPTNO      EMPNO ENAME             SAL
---------- ---------- ---------- ----------
        10       7782 CLARK            2450
                 7839 KING             5000
**********                       ----------
sum                                    7450

    DEPTNO      EMPNO ENAME             SAL
---------- ---------- ---------- ----------
        20       7788 SCOTT            3000
                 7902 FORD             3000
                 7566 JONES            2975
**********                       ----------
sum                                    8975

    DEPTNO      EMPNO ENAME                SAL
---------- ---------- ---------- ----------
        30       7698 BLAKE            2850
                 7499 ALLEN            1600
**********                       ----------
sum                                    4450

我的问题是如何在deptno(deptno 10,20,30)上使用BREAKCOMPUTE SUM一起返回表格EMP上的两个最高薪水(就像上面预期的那样)?

我认为我的代码非常好,但却遗漏了一些东西。

1 个答案:

答案 0 :(得分:0)

很抱歉,您的查询没有多大意义。你可以通过empno(和其他列)从emp和group中选择,所以你说:“给我来自emp的数据,但是每个empno使它成为一条记录”,这意味着根本没有分组(因为每个empno中只有一个记录) EMP)。

您的子查询

SELECT deptno, empno, ename, sal 
FROM emp
group by deptno, empno, ename, sal 
order by DEPTNO

相同
SELECT deptno, empno, ename, sal 
FROM emp
order by DEPTNO

然后你在deptno命令记录之后取两个第一行,这样就可以为第一个deptno任意选择两个emp记录。

你想要的是显示emp记录(即没有分组),每个部门有两个最高的工资。您可以使用分析函数DENSE_RANK对每个部分的工资进行排名。然后留下排名第1和第2的记录。

select deptno, empno, ename, sal
from
(
  select 
    deptno, empno, ename, sal,
    dense_rank() over (partition by deptno order by sal desc) as rnk
  from emp 
)
where rnk <= 2
order by deptno, sal desc;