Посчитайте SUM(quantity) для нужной категории и COUNT(DISTINCT order_id) за каждый период. Чтобы всегда получить две строки, задайте периоды отдельно.
1. Orders:
Посчитайте SUM(quantity) для нужной категории и COUNT(DISTINCT order_id) за каждый период. Чтобы всегда получить две строки, задайте периоды отдельно.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
- Orders:
- order_date datetime NOT NULL
- user_id int NOT NULL
- order_id int NOT NULL
- Goods:
- order_id int NOT NULL
- model int NOT NULL
- cat_1 varchar(50) NOT NULL
- price int NOT NULL
- quantity int NOT NULL
Значения в cat_1:
- Одежда
- Обувь
- Косметика
- Товары для дома
- Игрушки
Вывести количество заказов и "товаров нужной категории в заказе" за 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
Ответ
Посчитайте SUM(quantity) для нужной категории и COUNT(DISTINCT order_id) за каждый период. Чтобы всегда получить две строки, задайте периоды отдельно.
Вариант PostgreSQL, включая нули при отсутствии покупок:
WITH periods(yr, category, date_from, date_to) AS (
VALUES (2021, 'Одежда', DATE '2021-01-01', DATE '2022-01-01'),
(2022, 'Обувь', DATE '2022-01-01', DATE '2023-01-01')
), totals AS (
SELECT p.yr, SUM(g.quantity) AS goods_count,
COUNT(DISTINCT o.order_id) AS orders_count
FROM periods p
JOIN Orders o ON o.order_date >= p.date_from
AND o.order_date < p.date_to
JOIN Goods g ON g.order_id = o.order_id AND g.cat_1 = p.category
GROUP BY p.yr
)
SELECT p.yr AS year, COALESCE(t.goods_count, 0) AS goods_count,
COALESCE(t.orders_count, 0) AS orders_count
FROM periods p
LEFT JOIN totals t ON t.yr = p.yr
ORDER BY p.yr;
Orders предполагает одну строку на order_id. Количество товаров здесь — сумма единиц quantity, не число разных моделей. Диапазон даты не требует вычислять YEAR для каждой строки; DISTINCT нужен, чтобы заказ с несколькими подходящими позициями считался один раз.