Files
homework/vberetar/postgresql/sql_aggregation_grouping.sql
T
2026-05-23 00:42:45 +03:00

106 lines
4.8 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Задание 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. Я думаю проще увидеть отфильтрованные заказы, чем листать весь список с заказами.