2016-02-02 42 views
0
BREAK ON DEPTNO SKIP 1 
compute sum of sal on deptno 
SELECT deptno, empno, ename,sal FROM 
    (SELECT deptno, empno, ename, sal FROM emp) 
    WHERE EXISTS (SELECT deptno FROM dept)  order by 1,2 , sal desc ; 

如何从emp获得两个最高的sal,以及我的代码出了什么问题?如何在emp表中获得两个最高薪水?

+3

首先,你的代码对于这样一个简单的请求太复杂了。另外,你应该用你正在使用的数据库标记你的问题。 –

+0

是的,但我需要对每个部门的总和进行总结,并且只显示第一和第二高薪水,并且如果有两个薪水与同一记录,则比我必须显示三条记录(5000,3000,3000) –

回答

1

这并不完全清楚你想要什么。在标题中,你会说“两个最高的薪水”,但在评论中你提到了一笔总和。

以下将显示两个最高薪水。如果你想与最高的两个截然不同的工资在所有行

select deptno, dept_salary 
from (
    select deptno, dept_salary, 
     dense_rank() over (order by dept_salary desc) as rnk 
    from (
    SELECT deptno, sum(sal) as dept_salary 
    FROM emp 
    group by deptno 
) t1 
) t2 
where rnk <= 2 
order by dept_salary desc 
0

简单实际查询:

SELECT deptno, empno, ename,sal FROM emp eb 
WHERE (deptno, empno) IN 
    (SELECT depno, empno FROM 
     (SELECT deptno, empno FROM emp ei 
      WHERE ei.deptno = eb.deptno 
      ORDER BY ei.sal DESC 
     ) WHERE rownum <= 2 
    ); 

最后WHERE rownum <=2从SQL有所不同SQL,MySQL中你需要LIMIT 2,在MSSQL Server,您需要做的SELECT TOP 2,在Oracle WHERE rownum <= 2。取决于你使用的引擎。

+2

ANSI SQL方式是'FETCH FIRST 2 ROWS ONLY',由新版SQL Server和Oracle版本等支持, – jarlh

+0

谢谢,但现在没有任何记录deptno = 10。其他deptno 20和30只有一个记录。这是我现在的代码:BREAK ON DEPTNO SKIP 1 计算deptno上的sal总和 SELECT deptno,empno,ename,sal FROM emp WHERE rownum <= 2 order by sal desc; –

+0

@GoranBartBartolić:从问题来看,并不清楚你想要每个部门。更新。 –

2

:如果有多个“最高”工资,都将显示

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

每个部门得到这个,你可以使用这个各部门,然后使用dense_rank()如下:

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

它看起来像这个问题将被删除,但它也可能有一个正确的答案。

相关问题