Использование предложения HAVING в SQL - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь получить сотрудников, чей доход превышает 80% от общего среднего. Проблема в том, что предложение HAVING не работает, так как выдает следующую ошибку:

Это ошибка в строке HAVING (столбец 38):
ORA-00935 : групповая функция вложена слишком глубоко

Как исправить запрос на правильное использование HAVING?

SELECT 
  e.FIRST_NAME || ' ' || e.LAST_NAME as name,
  sum(o.order_total) as income
FROM  EMPLOYEES e, ORDERS o
WHERE e.employee_id = o.sales_rep_id 
GROUP BY e.FIRST_NAME, e.LAST_NAME
HAVING sum(o.order_total)*0.8 > avg(sum(o.order_total))
ORDER BY sum(o.order_total) DESC;

1 Ответ

1 голос
/ 08 марта 2020

Начиная с существующего запроса, вы можете использовать оконную функцию для вычисления этого большого среднего и использовать ее для фильтрации в предложении 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...