Запрос: SELECT dept, SUM(cost) FROM expenses GROUP BY dept HAVING SUM(cost) > (SELECT AVG(limit) FROM budgets). Что он вернёт?
AВсе отделы и их суммарные расходы, отсортированные по убыванию суммы в группе
BОтделы, у которых хотя бы одна статья расходов превышает средний норматив по таблице
CОтделы, у которых сумма расходов превышает максимальный норматив из таблицы
budgetsDОтделы, у которых сумма расходов превышает средний норматив по таблице
budgetsПравильный ответ. Скалярный подзапрос в
HAVING считает средний норматив, а сам HAVING оставляет отделы с суммой расходов выше этого порога.Разбор
В HAVING допустимы скалярные подзапросы, возвращающие одно значение. Здесь SELECT AVG(limit) FROM budgets выполняется один раз и даёт средний норматив по всей таблице. Внешний запрос группирует строки по столбцу отдела и оставляет только те группы, где сумма расходов превышает этот порог. Это стандартный приём, чтобы сравнить агрегат группы с агрегатом по другой таблице.
Проверь себя · 1/3разбор после ответа
В PostgreSQL нужно посчитать сумму продаж только по активным клиентам, при этом не исключая остальных клиентов из итоговой выборки. Какой синтаксис подойдёт?
Ещё вопросы по теме «Агрегация, GROUP BY и HAVING»
- Что делает оператор `DISTINCT` в `SELECT`-запросе?
- Что делает оператор `HAVING` в SQL-запросе с группировкой?
- Есть таблица `orders(user_id, amount)`. Какой запрос посчитает сумму всех заказов по каждому пользователю?
- Нужно посчитать сумму оплаченных заказов по каждому пользователю. В таблице `orders` есть поля `user_id`, `amount`, `status`. Какой запрос корректен и наиболее эффективен?
- В таблице пользователей есть колонка `middle_name`, в которой часто хранится `NULL`. Что вернёт выражение `COUNT(middle_name)`?
- Все вопросы по «Агрегация, GROUP BY и HAVING» →