Запрос: SELECT dept, SUM(cost) FROM expenses GROUP BY dept HAVING SUM(cost) > (SELECT AVG(limit) FROM budgets). Что он вернёт?

AВсе отделы и их суммарные расходы, отсортированные по убыванию суммы в группе
BОтделы, у которых хотя бы одна статья расходов превышает средний норматив по таблице
CОтделы, у которых сумма расходов превышает максимальный норматив из таблицы budgets
DОтделы, у которых сумма расходов превышает средний норматив по таблице budgets
Правильный ответ. Скалярный подзапрос в HAVING считает средний норматив, а сам HAVING оставляет отделы с суммой расходов выше этого порога.

Разбор

В HAVING допустимы скалярные подзапросы, возвращающие одно значение. Здесь SELECT AVG(limit) FROM budgets выполняется один раз и даёт средний норматив по всей таблице. Внешний запрос группирует строки по столбцу отдела и оставляет только те группы, где сумма расходов превышает этот порог. Это стандартный приём, чтобы сравнить агрегат группы с агрегатом по другой таблице.

Проверь себя · 1/3разбор после ответа
В PostgreSQL нужно посчитать сумму продаж только по активным клиентам, при этом не исключая остальных клиентов из итоговой выборки. Какой синтаксис подойдёт?
Тренировать SQL в Telegram

Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»