Фильтрация групп с HAVING
В каких жанрах не меньше 3 игр? WHERE фильтрует строки, поэтому можно попробовать так:
SELECT genre, COUNT(*) AS game_count
FROM games
WHERE COUNT(*) >= 3
GROUP BY genre;Error on line 1: misuse of aggregate: COUNT()База данных жалуется, что COUNT стоит там, где ей не место. WHERE проверяет строки по одной до того, как они сгруппированы, и в этот момент считать ещё нечего. Чтобы отфильтровать группы, в SQL есть HAVING. Он идёт сразу после GROUP BY, а его условие проверяется для каждой группы после вычисления агрегатных функций:
SELECT genre, COUNT(*) AS game_count
FROM games
GROUP BY genre
HAVING COUNT(*) >= 3
ORDER BY genre;| genre | game_count |
|---|---|
| Action | 4 |
| Adventure | 3 |
| Strategy | 3 |
Группы, не удовлетворяющие условию, в результат не попадают. В HAVING можно использовать всё, что вы знаете из WHERE: сравнения, AND, OR, NOT, BETWEEN… и агрегатные функции, даже те, которых нет в SELECT. Вот жанры, в которых игры стоят в среднем $25 или дешевле:
SELECT genre
FROM games
GROUP BY genre
HAVING AVG(price) <= 25
ORDER BY genre;| genre |
|---|
| Adventure |
| Puzzle |
| Racing |
| Simulation |
Части запроса пишутся в таком порядке: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT.
Типичная ошибка: WHERE вместо HAVING, как в первом запросе. Если в условии есть агрегатная функция, его место — в HAVING.
Задание
- 1
Покажите клиентов, которые сделали не меньше 3 заказов:
customer_idи количество их заказов в столбцеorder_count, отсортировав поcustomer_id:customer_id order_count 1 4 2 3 3 4 4 3 6 3 - 2
Ниже покажите заказы на сумму больше $60:
order_idи суммуquantity * priceв столбцеorder_total, от самого дорогого, а заказы с одинаковой суммой — поorder_id:order_id order_total 11 85 14 75 5 65 10 65 25 65 - 3
И игры, у которых не меньше 2 отзывов и средняя оценка не ниже 4 звёзд:
game_id, количество отзывов в столбцеreview_countи среднее число звёзд, округлённое до 2 знаков после запятой, в столбцеaverage_stars, отсортировав поgame_id:game_id review_count average_stars 1 4 4.25 3 2 4.5 6 2 4.0 7 2 4.5 10 2 4.5 15 2 4.5