← К оглавлению занятия

✅ Решения: HAVING

⚡ Кратко

  • Фильтр групп — HAVING COUNT(*) > ....
  • Совмещайте WHERE и HAVING для точной выборки.
  • Сортировка по агрегату помогает быстро увидеть топ групп.

Решение 1. Поставщики с более чем двумя продуктами

SELECT supplier_ids, COUNT(id) AS product_count
FROM products
GROUP BY supplier_ids
HAVING COUNT(id) > 2
ORDER BY product_count DESC;

Группируем по supplier_ids и отбираем группы, где количество продуктов больше двух.

Решение 2. Популярные комбинации цен

SELECT standard_cost, list_price, COUNT(product_name) AS product_count
FROM products
GROUP BY standard_cost, list_price
HAVING COUNT(product_name) > 1
ORDER BY product_count DESC, standard_cost;

Группировка по двум столбцам и фильтр групп с более чем одним продуктом.

Решение 3. Упаковка в унциях

SELECT standard_cost, COUNT(product_name) AS product_count
FROM products
WHERE LOWER(quantity_per_unit) LIKE '%oz%'
GROUP BY standard_cost
HAVING COUNT(product_name) > 2
ORDER BY product_count DESC;

WHERE отбирает строки с подстрокой 'oz', HAVING — группы из трёх и более строк.

Решение 4. Заказы с большим количеством товаров

SELECT order_id, SUM(quantity) AS total_quantity
FROM order_details
GROUP BY order_id
HAVING SUM(quantity) > 50
ORDER BY total_quantity DESC;

Суммируем количество товаров по заказам и оставляем только те, где итог больше 50.

Решение 5. Категории с высоким разбросом цен

SELECT category_id,
       COUNT(id) AS product_count,
       MIN(list_price) AS min_price,
       MAX(list_price) AS max_price,
       MAX(list_price) - MIN(list_price) AS price_range
FROM products
GROUP BY category_id
HAVING MAX(list_price) - MIN(list_price) > 100
ORDER BY price_range DESC;

Вычисляем разброс цен в каждой категории и фильтруем группы с разбросом более 100. В HAVING используем полное выражение, а не алиас, чтобы запрос работал в любой СУБД.