Для итогов по годам суммируйте quantity и считайте уникальные order_id. Для топ-3 сначала агрегируйте продажи по категории и модели, затем ранжируйте.
Вывести количество заказов и "товаров нужной категории в заказе" за 2021 год в категориях «Одежда» и за 2022 год в категории «Обувь»
Для итогов по годам суммируйте quantity и считайте уникальные order_id. Для топ-3 сначала агрегируйте продажи по категории и модели, затем ранжируйте.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Вывести количество заказов и "товаров нужной категории в заказе" за 2021 год в категориях «Одежда» и за 2022 год в категории «Обувь» (итоговый вид: 2 строки. Поля: год, количество товаров, количество заказов)
with cte as( select year(o.order_date) as year_orders, g.cat_1, count(distinct o.order_id) as count_orders, sum(g.quantity) as count_quan from Orders o join Goods g on o.order_id = g.order_id where (g.cat_1 = 'Одежда' and Year(o.order_date) = 2021) or (g.cat_1 = 'Обувь' and Year(o.order_date) = 2022) group by year_orders, g.cat_1 ) select year_orders, count_quan, count_orders from cte
за 2025 год топ-3 в каждой категории по количеству продаж model
with cte as( select cat_1, price, quantity, model, rank() over(partition by cat_1) as rk from Orders o join Goods g on o.order_id = g.order_id where Year(o.order_date) = 2025 )
за 2025 год топ-3 в каждой категории по сумме продаж model
with cte as( select g.cat_1, g.model, (price * quantity), rank() over(partition by g.cat_1) as rk from Orders o join Goods g on o.order_id = g.order_id where Year(o.order_date) = 2025 )
with cte as( select g.cat_1, g.model, sum(price * quantity) as sum_, rank() over(partition by g.cat_1 order by sum() desc) as rk from Orders o join Goods g on o.order_id = g.order_id where Year(o.order_date) = 2025 )
with cte1 as( select g.cat_1, g.model, sum(price * quantity) as sum_total, from Orders o join Goods g on o.order_id = g.order_id where Year(o.order_date) = 2025 ), cte2 as(select g.cat_1, g.model, sum_total, rank() over(partition by g.cat_1 order sum_total desc) as rk from cte1 ) select g.cat_1, g.model, sum_total from cte2 where rk <=3
with cte1 as( select g.cat_1 as cat_name, g.model as model, sum(price * quantity) as sum_total, from Orders o join Goods g on o.order_id = g.order_id where Year(o.order_date) = 2025 group by Year(o.order_date), g.model ), cte2 as(select cat_name, model, sum_total, rank() over(partition by cat_name order sum_total desc) as rk from cte1 ) select cat_name, model, sum_total from cte2 where rk <=3
Ответ
Для итогов по годам суммируйте quantity и считайте уникальные order_id. Для топ-3 сначала агрегируйте продажи по категории и модели, затем ранжируйте.
Ниже PostgreSQL-вариант, сохраняющий две строки даже при отсутствии продаж:
WITH targets(y, category, d1, d2) AS (
VALUES (2021, 'Одежда', DATE '2021-01-01', DATE '2022-01-01'),
(2022, 'Обувь', DATE '2022-01-01', DATE '2023-01-01')
), sales AS (
SELECT o.order_id, o.order_date, g.cat_1, g.quantity
FROM Orders o JOIN Goods g ON g.order_id = o.order_id
)
SELECT t.y AS year,
COALESCE(SUM(s.quantity), 0) AS goods_count,
COUNT(DISTINCT s.order_id) AS orders_count
FROM targets t
LEFT JOIN sales s ON s.cat_1 = t.category
AND s.order_date >= t.d1 AND s.order_date < t.d2
GROUP BY t.y
ORDER BY t.y;
Топ-3 моделей по сумме продаж за 2025 год:
WITH totals AS (
SELECT g.cat_1, g.model, SUM(g.price * g.quantity) AS metric
FROM Orders o JOIN Goods g ON g.order_id = o.order_id
WHERE o.order_date >= DATE '2025-01-01'
AND o.order_date < DATE '2026-01-01'
GROUP BY g.cat_1, g.model
), ranked AS (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY cat_1 ORDER BY metric DESC, model
) AS rn
FROM totals
)
SELECT cat_1, model, metric
FROM ranked WHERE rn <= 3
ORDER BY cat_1, rn;
Для топа по количеству замените SUM(g.price * g.quantity) на SUM(g.quantity). ROW_NUMBER даёт не более трёх моделей; если нужны все равные места, выберите RANK или DENSE_RANK и уточните правило ничьих. Предполагается, что Orders содержит одну строку на заказ.