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 71ac04c7d3 - Show all commits
@@ -0,0 +1,105 @@
-- Задание 1
SELECT category, COUNT(*) AS products_count
FROM products
GROUP BY category
ORDER BY products_count DESC;
-- Ответ на вопросы
-- 1. С ORDER BY гораздо удобней читать результат, без него данные отдаются в непонятном порядке.
-- 2. Для категории smartphone добавится +1 значение.
-- Задание 2
SELECT order_id,
SUM(quantity) AS total_quantity,
SUM(quantity * price_at_purchase) AS order_revenue
FROM order_items
GROUP BY order_id
ORDER BY order_revenue DESC;
-- Ответ на вопросы
-- 1. Если убрать GROUP BY и order_id то запрос выдаст 1 строку со всеми суммами total_quantity и order_revenue.
-- Если убрать только GROUP BY и не убрать order_id то выдаст ошибку. Так как нельзя оставлять неагрегированные столбцы без GROUP BY.
-- 2. Если добавить product_id без добавления её в GROUP BY или агрегат то выдаст ошибку.
-- Задание 3
SELECT p.category,
SUM(oi.quantity * oi.price_at_purchase) AS category_revenue
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category
ORDER BY category_revenue;
-- Ответ на вопросы
-- 1. По задаче нам же нужно сгруппировать и посчитать сумму по категориям а не по id товарам.
-- 2. Если добавить p.name в SELECT без добавления её в GROUP BY или агрегат то выдаст ошибку. Нельзя вставлять неагрегированные столбцы без GROUP BY.
-- Задание 4
SELECT oi.order_id,
SUM(oi.quantity * oi.price_at_purchase) AS order_revenue
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
WHERE o.status = 'paid'
GROUP BY oi.order_id
ORDER BY order_revenue DESC;
-- Ответ на вопросы
-- 1. В этом задании мы получили сумму(выручку) по заказам оплаченным, а в прошлом задании мы получили сумму(выручку) по категориям товаров.
-- 2. Посчитать выручку, сколько заработала компания. Остальные заказы еще не оплачены.
-- Задание 5
SELECT p.category,
SUM(oi.quantity * oi.price_at_purchase) AS category_revenue
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY p.category
HAVING SUM(oi.quantity * oi.price_at_purchase) > 1000
ORDER BY category_revenue;
-- Ответ на вопросы
-- 1. WHERE не принимает агрегирующие функции, можно сделать так - WHERE oi.quantity * oi.price_at_purchase > 1000
-- 2. WHERE фильтрует до GROUP BY, а HAVING после GROUP BY.
-- Задание 6
SELECT country,
COUNT(*) AS active_users_count
FROM users
WHERE is_active = TRUE
GROUP BY country
HAVING COUNT(*) > 2
ORDER BY active_users_count DESC;
-- Ответ на вопросы
-- 1. Предположу что отбрасывает неактивных пользователей сразу, перед групировкой и агрегаций. В дальнейшем может сэкономить на времени вычисления, особенно если данных будет много.
-- 2. Пустую таблицу без строк.
-- Задание 7
SELECT p.name AS product_name,
SUM(oi.quantity) AS total_quantity_sold
FROM order_items oi
JOIN products p ON p.id = oi.product_id
GROUP BY product_name
ORDER BY total_quantity_sold DESC
LIMIT 3;
-- Ответ на вопросы
-- 1. Тут мы выясняем какой товар самый ходовой и сколько его продается, а рейтинг по выручке показывает сколько зарабатывает фирма от продажи товара.
-- 2. В случаях когда, например, нужно выяснить какой товар хорошо продается чтоб его закупить на склад для продажи.
-- Задание 8
SELECT order_id,
SUM(quantity * price_at_purchase) AS order_revenue
FROM order_items
GROUP BY order_id
HAVING SUM(quantity * price_at_purchase) < 100
ORDER BY order_revenue DESC;
-- Ответ на вопросы
-- 1. Есть товары дешевые и люди которые мало зарабатывают, ещё есть всякие скидки на ряд товаров.
-- 2. Я думаю проще увидеть отфильтрованные заказы, чем листать весь список с заказами.