✅ Решения: Практикум 5
⚡ Кратко
Решения всех 8 задач с использованием GROUP BY, HAVING и CASE.
Решение 1. Статистики по standard_cost
SELECT AVG(standard_cost) AS avg_cost,
MIN(standard_cost) AS min_cost,
MAX(standard_cost) AS max_cost,
SUM(standard_cost) AS total_cost
FROM products;
Решение 2. Категории с тремя и более товарами
SELECT category, COUNT(id) AS product_count
FROM products
GROUP BY category
HAVING COUNT(id) >= 3
ORDER BY product_count DESC;
Фильтр по количеству товаров выполняется через HAVING, потому что условие зависит от агрегата.
Решение 3. Средняя себестоимость по поставщику и категории
SELECT supplier_ids, category, AVG(standard_cost) AS avg_cost
FROM products
GROUP BY supplier_ids, category
ORDER BY avg_cost DESC;
Решение 4. Пропуски minimum_reorder_quantity
SELECT COUNT(id) AS missing_reorder
FROM products
WHERE minimum_reorder_quantity IS NULL;
Решение 5. Уникальные категории
SELECT COUNT(DISTINCT category) AS unique_categories
FROM products;
Решение 6. Группировка по уровню запаса
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) AS avg_price,
MIN(list_price) AS min_price,
MAX(list_price) AS max_price
FROM products
GROUP BY stock_level
ORDER BY avg_price DESC;
Решение 7. Средняя себестоимость товаров в коробках
SELECT AVG(standard_cost) AS avg_box_cost
FROM products
WHERE LOWER(quantity_per_unit) LIKE '%box%';
Решение 8. Суммарная прибыль по категориям
SELECT category,
SUM(list_price - standard_cost) AS total_profit
FROM products
WHERE target_level > 40
GROUP BY category
ORDER BY total_profit DESC;
Фильтр по target_level — это фильтр строк, поэтому он находится в WHERE, а не в HAVING.