homework, pet project DE Dmitry_Medvedev #1

Open
dmitry_medvedev wants to merge 264 commits from md_branch into main
Showing only changes of commit 204913caa8 - Show all commits
+130
View File
@@ -0,0 +1,130 @@
--task 1
--Задача 1. Сколько товаров в каждой категории
SELECT p.category, COUNT (*) AS products_count
FROM products p
GROUP BY category
ORDER BY products_count DESC
/*Что будет, если убрать ORDER BY — как изменится чтение результата для продукта/аналитика?
Аналитик может пропустить товар с самым большим значением или с самым малым
Если добавить в таблицу новый товар с категорией smartphone, как изменится строка для этой категории?
Тогда количество увеличится на 1
*/
--таск 2
--Задача 2. Выручка по каждому заказу
SELECT order_id, SUM(quantity) AS total_quantity, SUM(quantity * price_at_purchase) AS order_revenue
FROM order_items oi
GROUP BY order_id
ORDER BY order_revenue DESC
/*Что будет, если убрать GROUP BY и оставить SUM(quantity * price_at_purchase)?
Будет ошибка, так как order_id нигде не задействовано
Почему нельзя просто добавить в SELECT ещё одну колонку (например, product_id) без добавления её в GROUP BY или агрегат?
Потому что при использовании агрегатных функций всегда что-то должно по чему-то группироваться, в данном случае идет группировка по order_id, если добавить что-то другое в селект, то нужно будет это тоже использовать в GROUP BY
*/
--таск 3
--Задача 3. Выручка по категориям товаров
SELECT category, SUM (oi.quantity * oi.price_at_purchase) AS category_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY p.category
ORDER BY category_revenue DESC
/*Почему группировка идёт по p.category, а не по p.id?
Задача была группировать по категориям, поэтому так. Если бы задача была группировать по айдишникам продуктов, то да, делали бы так.
Если добавить в SELECT ещё p.name, что произойдёт с результатом и почему?
Выдаст ошибку, потому что p.name дальше не используется ни в агрегате ни в группировке.
*/
--таск 4
--Задача 4. Только оплаченные заказы и их выручка
SELECT COUNT(order_id), SUM (oi.quantity * oi.price_at_purchase) AS order_revenue
FROM order_items oi
JOIN orders o ON oi.order_id = o.id
WHERE status = 'paid'
ORDER BY order_revenue DESC
/*
Чем результат этой задачи будет отличаться от задачи 2 (где статус не учитывался)?
Во-первых здесь в выдаче одна строчка, во-вторых во второй задаче суммировались все заказы, даже не оплаченные.
В какой реальной ситуации ты бы смотрел только на paid заказы, а не на все?
Когда необходимо подбить сколько именно денег пришло на счет за определенный период.
*/
--таск 5
--Задача 5. Категории с выручкой больше 1000 (HAVING)
SELECT category, SUM (oi.quantity * oi.price_at_purchase) AS category_revenue
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY p.category
ORDER BY category_revenue DESC
/* Почему нельзя написать WHERE category_revenue > 1000?
Потому что where фильтрует только строки, а не группы
Чем WHERE price > 1000 принципиально отличается от HAVING SUM(...) > 1000?
Принципиально отличается тем что именно фильтруется и тем когда это делается,
WHERE ставится до GROUP BY, а HAVING уже после GROUP BY
*/
--таск 6
--Задача 6. Страны с достаточным числом активных пользователей
SELECT country, COUNT(*) AS active_users_count
FROM users u
WHERE is_active IS TRUE
GROUP BY country
HAVING COUNT(*) >= 2
ORDER BY active_users_count DESC
/*
Почему фильтр по активности (is_active = true) логичнее писать в WHERE, а не в HAVING?
Потому что WHERE проверяет каждую строку, а у HAVING другая функция
Что покажет запрос, если в данных пока нет ни одной страны с active_users_count >= 2?
Запрос покажет пустую таблицу без данных
*/
--таск 7
--Задача 7. Топ‑товары по количеству продаж
SELECT p.name product_name, SUM(quantity) AS total_quantity_sold
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY product_name
ORDER BY SUM(quantity) DESC
LIMIT 3
/*
Чем рейтинг по total_quantity_sold отличается от рейтинга по выручке (SUM(quantity * price_at_purchase))?
Тем что мы видим самые продаваемые товары, которые имеют наибольшую популярность и здесь появляются вопросы , а почему так? продаем слишком дешево или товары слишком классные?
В любом случае для бизнеса лучше всего поднять цену на такие товары, чтобы они приносили больше прибыли.
В каких случаях бизнесу важнее смотреть на количество, а не на деньги?
Я думаю что количество всегда важнее, а лучше и количество и выручка. Именно количество дает понимание оборачиваемости по продукту и его востребованности.
Бывают товары с большой стоимостью и маленьким количеством продаж относительно других, такие товары неликвидны.
*/
--таск 8
--Задача 8. Заказы с «маленькой» выручкой
SELECT order_id, SUM(quantity * price_at_purchase) AS order_revenue
FROM order_items oi
GROUP BY order_id
HAVING SUM(quantity * price_at_purchase) < 100
ORDER BY SUM(quantity * price_at_purchase)
/*
Какие реальные причины могут быть у очень маленьких заказов (1–2 гипотезы)?
Заниженная цена, неликвидность товара.
Что проще увидеть глазами: просто все заказы с суммой или именно отфильтрованные «микро‑заказы»?
Отфильтрованные микро-заказы.
*/