2016-04-10 2 views
2

Задача: Список Имя и зарплата самого высокого и самого низкого платного сотрудника из каждого отдела. Вы также можете выполнять запросы для самых высоких и самых низких отдельно.Упрощение запроса с использованием базы данных образцов оракулов

Пробовал Запрос:

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

Вы можете использовать функции окна оракула как row_number в сочетании с условной агрегации с помощью CASE EXPRESSION:

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:, если все, что вам нужно это минимальная и максимальная зарплата на каждом отделении, то вот простая группа по статье :

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. Итак, можем ли мы упростить его, используя простые суб-quries? @sagi –

+0

@nafeesahmed вам нужно вернуть имя сотрудника? или вам просто нужно вывести -> 'DEPname, maxSal, minSal'? – sagi

+0

i NEED JUST DEPname, maxSal, minSal –

0

ВЫБОР d.dname, Макс (e.sal) MAXSAL, Мин (e.sal) MINSAL ОТ DEPT д, е EMP ГДЕ d.dept no = e.deptno group by d.dname

Смежные вопросы