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)
Другие вопросы по тегам