diff --git a/vberetar/postgresql/sql_aggregation_grouping.sql b/vberetar/postgresql/sql_aggregation_grouping.sql new file mode 100644 index 0000000..6140687 --- /dev/null +++ b/vberetar/postgresql/sql_aggregation_grouping.sql @@ -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. Я думаю проще увидеть отфильтрованные заказы, чем листать весь список с заказами.