Начиная с существующего запроса, вы можете использовать оконную функцию для вычисления этого большого среднего и использовать ее для фильтрации в предложении having
:
select
e.first_name || ' ' || e.last_name name,
sum(o.order_total) income
from employees e
inner join orders o on e.employee_id = o.sales_rep_id
group by e.employee_id, e.first_name, e.last_name
having sum(o.order_total) > 0.8 * avg(sum(o.order_total)) over()
order by sum(o.order_total) desc;
Примечания:
- всегда используйте явные объединения (с ключевым словом
on
), а не old-school, неявные объединения - Я добавил идентификатор сотрудника в предложение
group by
, чтобы предотвратить неправильная группировка возможных омонимов
В качестве альтернативы вы можете использовать подзапрос:
select name, income
from (
select
e.first_name || ' ' || e.last_name name,
sum(o.order_total) income,
avg(sum(o.order_total)) over() avg_income
from employees e
inner join orders o on e.employee_id = o.sales_rep_id
group by e.employee_id, e.first_name, e.last_name
) t
where income > 0.8 * avg_income
order by income desc;