1. Orders:

Посчитайте SUM(quantity) для нужной категории и COUNT(DISTINCT order_id) за каждый период. Чтобы всегда получить две строки, задайте периоды отдельно.

Короткий ответ

Что ответить на собеседовании

Посчитайте SUM(quantity) для нужной категории и COUNT(DISTINCT order_id) за каждый период. Чтобы всегда получить две строки, задайте периоды отдельно.

Подробный разбор

Ответ с пояснениями

Условие

  1. Orders:
  • order_date datetime NOT NULL
  • user_id int NOT NULL
  • order_id int NOT NULL
  1. 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 нужен, чтобы заказ с несколькими подходящими позициями считался один раз.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее