2016-02-02 44 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; 

它看起來像這個問題將被刪除,但它也可能有一個正確的答案。

相關問題