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

Занятие 19. Практикум 5

📁 Блок: SQL / MySQL / Практика ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#avg #min #max #sum #count #distinct #where #having #group #by

⚡ Кратко

Практикум закрепляет агрегаты, GROUP BY и HAVING на реальных данных таблицы products.

📖 Теоретическая база практикума

Занятие состоит из восьми задач, которые покрывают следующие темы:

1. Базовые агрегаты

Для вычисления итоговых значений по столбцу используются AVG, MIN, MAX и SUM:

SELECT AVG(standard_cost), MIN(standard_cost),
       MAX(standard_cost), SUM(standard_cost)
FROM products;

2. Группировка с фильтром групп

GROUP BY объединяет строки, а HAVING отбирает только подходящие группы:

SELECT category, COUNT(id) AS product_count
FROM products
GROUP BY category
HAVING COUNT(id) >= 3;

3. Группировка по нескольким столбцам

Можно группировать сразу по двум и более столбцам:

SELECT supplier_ids, category, AVG(standard_cost) AS avg_cost
FROM products
GROUP BY supplier_ids, category;

4. Условные категории в GROUP BY

CASE внутри SELECT создаёт вычисляемую группу:

SELECT CASE
         WHEN reorder_level < 10 THEN 'low'
         WHEN reorder_level BETWEEN 10 AND 20 THEN 'medium'
         ELSE 'high'
       END AS stock_level,
       AVG(list_price), MIN(list_price), MAX(list_price)
FROM products
GROUP BY stock_level;

Проверить по документации: использование алиаса из CASE в GROUP BY работает в MySQL, но в PostgreSQL/SQL Server обычно требуется повторять выражение CASE целиком.

5. Производные показатели

Агрегат можно применить к выражению, например вычислить суммарную прибыль:

SELECT category, SUM(list_price - standard_cost) AS total_profit
FROM products
WHERE target_level > 40
GROUP BY category;