Oracle SQL - Сравнение функций AVG в ГДЕ
Я пытаюсь написать несколько сценариев Oracle SQL для назначения. Мне удалось заставить все это работать, кроме одной части. Подводя итог, я должен отобразить данные из 2 таблиц, если среднее значение для одного столбца в таблице A больше, чем среднее значение для другого столбца в таблице B. Я понимаю, что нельзя включать функции AVG в предложение WHERE или предложение HAVING, так как оно кажется невозможным чтобы правильно получить доступ к данным (из того, что я прочитал). Когда я исключаю это предложение, скрипт выполняется правильно, поэтому я уверен, что других ошибок нет.
Я попытался написать это следующим образом, но я получаю ошибку ORA-00936: отсутствует выражение, и оно находится перед знаком>. Я думал, что это может быть из-за неправильного размещения скобки, но ни одна из моих попыток не решила это Вот моя попытка:
SELECT l.l_category, SUM(r.r_sold), AVG(l.l_cost)
FROM promos l
INNER JOIN sales r
ON r.promo_id = l.promo_id
GROUP BY l.l_category
HAVING (SELECT AVG(l.l_cost) OVER (PARTITION BY l.l_cost)) >
(SELECT AVG(r.r_sold) OVER (PARTITION BY r.r_sold));
Я пытался сделать это без OVER (PARTITION BY ...), а также поместить его в предложение WHERE, но это не помогло устранить ошибку. Я почти уверен, что мне нужно как-то поместить его в оператор SELECT, но я в растерянности.
1 ответ
Вам не нужно использовать предложение OVER при применении агрегатных функций в предложении HAVING. Просто используйте агрегатные функции самостоятельно.
SELECT l.l_category, SUM(r.r_sold), AVG(l.l_cost)
FROM promos l
INNER JOIN sales r
ON r.promo_id = l.promo_id
GROUP BY l.l_category
HAVING HAVING AVG(l.l_cost) > AVG(r.r_sold)