2016-04-10 22 views
2

Görev: Liste Her bölümden en yüksek ve en düşük ücretli çalışanın adı ve maaşı. Ayrıca, en yüksek ve en düşük sorguları da gerçekleştirebilirsiniz.Oracle örnek veritabanını kullanarak sorgu sadeleştirme

çalıştı Sorgu:

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; 

Sonucu

enter image description here

Sonucu doğrudur.

Soru) Sorgulamayı basitleştirmenin başka bir yolu var mı?

cevap

2

Sen CASE EXPRESSION kullanarak koşullu toplama ile kombine row_number gibi ORACLE'ın pencere işlevleri kullanabilirsiniz:

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 

DÜZENLEME: her departman minimum ve maksimum maaş ardından maddesi ile basit bir grup şu tek ihtiyacınız olup olmadığını :

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'de yeni başlayan biriyim. Bu yüzden basit alt-çitler kullanarak basitleştirebilir miyiz? @sagi –

+0

@nafeesahmed çalışan adını geri getirmek için gerekli mi? ya da sadece çıktı almanız gerekiyor -> 'DEPname, maxSal, minSal'? – sagi

+0

i NEED JUST DEPname, maxSal, minSal –

0

SEC d.dname, azami (e.sal) MAXSAL Min (e.sal) borç D'den MINSAL , eMP e WHERE d.dept no = e.deptno grup d.dname tarafından