GROUP BY - встроенный просмотр и несоединенные таблицы - PullRequest
0 голосов
/ 18 февраля 2019

У меня следующий запрос ORACLE, где я пытаюсь найти отдел с самой высокой средней зарплатой.Я хотел бы использовать встроенное представление (то есть сохранить набор данных b) для этой реализации, но изо всех сил пытаться получить правильную часть в компонентах WHERE и GROUP BY.Я знаю, что приведенные ниже GROUP BY и WHERE (которых не существует) неверны.Но как мне их исправить?

select a.deptno from emp a, 
(select max(avg_sal) max_avg_sal from (select  
avg(sal) avg_sal from emp group by deptno) ) b 
group by a.deptno, b.max_avg_sal 
having avg(a.sal) = b.max_avg_sal

Ожидаемый результат

deptno
10

Структура Emp

deptno staff sal
10     A     1000
10     B     1500
11     C     1100
12     D     1000
12     E     900
12     F     1000

Ответы [ 4 ]

0 голосов
/ 18 февраля 2019

Я не знаю, почему вы хотели бы написать это так, но если вы действительно хотите только встроенные представления и никаких оконных предложений, вы можете написать это так:

select b.deptno 
from   (SELECT deptno, avg(sal) avgsal from emp group by deptno ) b
cross join (SELECT max(avgsal) maxavgsal FROM (SELECT avg(sal) avgsal FROM emp group by deptno )) c
where  b.avgsal = c.maxavgsal;

Этото же самое, если вам не нравится CROSS JOIN по какой-то причине:

select b.deptno 
from   (SELECT deptno, avg(sal) avgsal from emp group by deptno ) b
inner join ( SELECT max(avgsal) maxavgsal FROM 
   ( SELECT avg(sal) avgsal FROM emp group by deptno ) ) c
on b.avgsal = c.maxavgsal;
0 голосов
/ 18 февраля 2019

Вы можете использовать подзапрос

select deptno from tablename
group by deptno
having avg(sal)= (select max(asal) from (select avg(sal) as asal from tablename group by deptdno)A)
0 голосов
/ 18 февраля 2019

Прямой путь:

select deptno
from emp
group by deptno
order by avg(salary) desc
fetch first row with ties;

FETCH FIRST доступен с Oracle 12c.

В Oracle 11g мы могли бы использовать это вместо:

select deptno
from
(
  select deptno, avg(salary) as avg_salary, max(avg(salary)) over () as max_avg_salary
  from emp
  group by deptno
)
where avg_salary = max_avg_salary;

Но вам нужно встроенное представление, другое слово для производной таблицы (подзапрос в предложении from).Это выглядит неуклюже.Один пример без FETCH FIRST и без оконных функций:

with d as
(
  select deptno, avg(salary) as avg_salary
  from emp
  group by deptno
)
, dmax as
(
  select max(avg_salary) as max_avg_salary
  from d
)
select d.*
from d
join dmax on dmax.max_avg_salary = d.avg_salary;

Я считаю это очень запутанным и не рекомендую его вообще.Конечно, вы можете сделать то же самое без WITH.Тогда это еще менее читабельно.

0 голосов
/ 18 февраля 2019

Это то, что вы хотите?

select e.*
from (select e.*, avg(e.salary) over (partition by e.deptno) as avg_salary
      from emp e
     ) e
order by avg_salary desc
fetch first 1 row only;

fetch first доступно в Oracle 12c +.Вы можете делать подобные вещи с помощью дополнительного подзапроса в более ранних версиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...