-- Задание 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. Я думаю проще увидеть отфильтрованные заказы, чем листать весь список с заказами.