2016-04-10 10 views
2

タスク: リスト各部門の最高および最低給与従業員の名前と給与。 最高と最低のクエリを別々に実行することもできます。oracleサンプル・データベースを使用した問合せの簡素化

しようとしたクエリ:

SELECT dept.deptno, 
     dname, 
     minsal, 
     maxsal 
FROM dept, 
     (SELECT deptno, 
       Max (sal) MAXSAL 
     FROM emp 
     GROUP BY deptno) MAXSALARY, 
     (SELECT deptno, 
       Min (sal)MINSAL 
     FROM emp 
     GROUP BY deptno) MINSALARY 
WHERE MAXSALARY.deptno = dept.deptno 
     AND MINSALARY.deptno = dept.deptno; 

結果

enter image description here

結果は正しいです。

質問) クエリを簡略化する他の方法はありますか?

答えて

2

あなたはCASE EXPRESSIONを使用して、条件付きの集約と組み合わせrow_numberようORACLEのウィンドウ関数を使用することができます。

SELECT t.ename,t.dname, 
     MAX(CASE WHEN t.low_ind = 1 then t.salary END), 
     MAX(CASE WHEN t.high_ind = 1 then t.salary END) 
FROM (SELECT e.name as ename,d.name as dname,e.salary, 
      ROW_NUMBER() OVER(PARTITION BY d.name ORDER BY e.salary ASC) as low_ind, 
      ROW_NUMBER() OVER(PARTITION BY d.name ORDER BY e.salary DESC) as high_ind 
     FROM emp e 
     INNER JOIN dept d 
     ON(d.deptno = e.deptno)) t 
GROUP BY t.ename,t.dname 

EDIT:は、各部門での最小と最大の給料は、句によって、簡単なグループのthatsあなたが必要とするすべてがされている場合:

SELECT d.deptno,d.dname,MIN(e.salary) as min_sal,MAX(e.salary) as max_sal 
FROM dept d 
INNER JOIN emp e 
ON(d.deptno = e.deptno) 
GROUP BY d.deptno,d.name 
+1

私はsqlの初心者です。単純な小計を使って単純化できますか? @サギ –

+0

@nafeesahmed従業員の名前を返す必要がありますか?または、単に 'DEPname、maxSal、minSal'を出力する必要がありますか? – sagi

+0

私はちょうどDEPname、maxSal、minSalが必要です –

0

SELECT d.dname、MAX(e.sal)MAXSAL、MIN(e.sal)MINSAL DEPT Dから、EMP電子 d.dept no = e.deptno グループby d.dname

関連する問題