2015-12-02 65 views
0

我有2個工作子查詢,它檢查所有部門(DEPTNO)中的最小和最大SUMS。表EMP和DEPT具有DEPTNO細胞oracle SQL:通過最小和最大總和獲得DEPT

(SELECT min(sum(e.SAL)) FROM EMP e GROUP by e.DEPTNO); 
(SELECT max(sum(e.SAL)) FROM EMP e GROUP by e.DEPTNO); 

如何檢查什麼是MIN-和MAX-子查詢DEPTNO? 我的代碼是錯誤:

SELECT d.DEPTNO 
FROM DEPT d 
WHERE sum(e.SAL) = (SELECT max(sum(e.SAL)) FROM EMP e GROUP by d.DEPTNO); 

回答

0

好吧,這是難度比它看起來在第一。這是我最終得到它的工作,但我更喜歡@ vkp的答案。

with sums as 
(
    SELECT DEPTNO, SUM(SAL) AS SSAL 
    FROM EMP 
    GROUP BY DEPTNO 
), mm as 
(
    SELECT DEPTNO, SSAL, MIN(SSAL) OVER() as MIN_SSAL, MAX(SSAL) OVER() as MAX_SSAL 
    FROM SUMS 
) 
SELECT 'MIN', DEPTNO, SSAL FROM mm WHERE SSAL=MIN_SSAL 
UNION ALL 
SELECT 'MAX', DEPTNO, SSAL FROM mm WHERE SSAL=MAX_SSAL 

http://sqlfiddle.com/#!6/410c8/8

+0

我認爲你需要像'HAVING SUM(e.SAL)= MIN(SUM(SAL))' –

+0

@JuanCarlosOropeza - 你試試我的代碼? – Hogan

+0

好的。我試試看,並沒有工作.http://sqlfiddle.com/#!6/410c8/1 –

1

如果你想在部門枝條最大總和,您可以使用rownumrow_number()

select ed.* 
from (select e.deptno, sum(e.sal) as sums, 
      row_number() over (order by sum(e.sal) desc) as seqnum 
     from emp e 
     group by e.deptno 
    ) ed 
where seqnum = 1; 

在Oracle12克+,這也可以寫成:

 select e.deptno, sum(e.sal) as sums, 
      row_number() over (order by sum(e.sal) desc) as seqnum 
     from emp e 
     group by e.deptno 
     order by sum(e.sal) desc 
     fetch first 1 row only; 
+0

的作品,但我需要的是隻顯示部分最大或最小通過提取1排... – mallorn

1

這是一種使用的方法

with salsums as (select deptno, sum(sal) salsum from emp group by deptno) 
, maxandmin as (select max(salsum) maxsal, min(salsum) minsal from salsums) 
select deptno 
from salsums cross join maxandmin 
where salsum = maxsal or salsum = minsal 
+0

這是可愛的,我喜歡它。 – Hogan

+0

這個工程,但我從來沒有使用「與...」:/ ...但我會重建它的方式,謝謝! – mallorn