2

这是我的代码:

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)BREAK上的表EMP上总结两个最高工资?COMPUTE SUM

我认为我的代码非常好,但缺少一些东西。

4

1 回答 1

0

很抱歉,您的查询没有多大意义。您从 emp 中选择并按 empno(和其他列)分组,所以您说:“给我 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 排序后取前两行,因此您将获得两个任意选择的 emp 记录作为第一个 deptno。

相反,您想要的是显示每个部门的两个最高工资的 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;
于 2016-02-04T10:33:45.363 回答