这是我的代码:
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
和COMPUTE SUM
一起返回表格EMP上的两个最高薪水(就像上面预期的那样)?
我认为我的代码非常好,但却遗漏了一些东西。
答案 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;