Составьте список сотрудников (имя, base_salary), которые зарабатывают среднее значение (с точностью до 30%) от среднего заработка в командах из> 2 сотрудников. - PullRequest
0 голосов
/ 18 июня 2020

Вот что я получил до сих пор:

SELECT surname, base_salary from emp p LEFT JOIN (select id_team, avg(base_salary) as s, count(*) as c from emp group by id_team) as o ON(p.id_team = o.id_team)
where p.base_salary between o.s*0.7 and o.s*1.3 and o.c >=2

On Oracle LIVE SQL Я получаю ORA-00905: ошибка отсутствия ключевого слова.

Вот как выглядит таблица лайк.

table

1 Ответ

0 голосов
/ 18 июня 2020

Проблема с вашим заключается в использовании ключевого слова as для псевдонима подзапроса. Oracle не поддерживает это. Ваш запрос должен работать, если вы его удалите:

select ...
from emp p 
left join (
    select id_team, avg(base_salary) as s, count(*) as c from emp group by id_team
) as o on p.id_team = o.id_team)
--^-- here  
where ...

С другой стороны, я думаю, что ваш запрос можно было бы сформулировать более эффективно, используя оконные функции:

select surname, base_salary
from (
    select 
        surname, 
        base_salary, 
        avg(base_salary) over(partition by id_team) avg_base_salary,
        count(*) over(partition by id_team) no_emps
    from emp 
) e
where no_emps > 2 and base_salary between avg_base_salary * 0.7 and avg_base_salary * 1.3 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...