Продажи по месяцам
Предложения уйдут на следующей неделе, а магазин хочет знать, как идут его продажи сейчас, чтобы потом сравнить: выручку за каждый месяц.
Выручка — это деньги, которые получил магазин: для каждой позиции каждого оплаченного заказа — количество, умноженное на цену. Берите цену из order_items: это то, что покупатель действительно заплатил. В «Чёрную пятницу» заказ 28 получил игры дешевле, чем указано в games.price.
Чтобы сгруппировать заказы по месяцам, нужен месяц каждого заказа, и его получают из даты функцией strftime(): strftime('%Y-%m', ordered_at) даёт год и месяц, например '2025-11', а strftime('%Y', ordered_at) — только год:
SELECT id, ordered_at,
strftime('%Y-%m', ordered_at) AS month,
strftime('%Y', ordered_at) AS year
FROM orders
WHERE id IN (4, 17, 28);| id | ordered_at | month | year |
|---|---|---|---|
| 4 | 2024-03-15 | 2024-03 | 2024 |
| 17 | 2025-03-03 | 2025-03 | 2025 |
| 28 | 2025-11-28 | 2025-11 | 2025 |
Дайте такому столбцу псевдоним, и его можно использовать в GROUP BY и ORDER BY. Месяцы вида 'YYYY-MM' сортируются в порядке времени, как и целые даты.
Типичная ошибка: считать заказы через COUNT(*). После соединения с order_items каждый заказ встречается столько раз, сколько в нём игр, поэтому COUNT(*) считает позиции, а не заказы. COUNT(DISTINCT o.id) считает каждый заказ один раз.
И ещё одна ловушка: strftime() возвращает текст, поэтому сравнивайте его результат с текстом: strftime('%Y', ordered_at) = '2025'. С числом 2025 условие никогда не выполнится, потому что SQLite не считает число и текст равными.
Задание
- 1
Под комментарием
-- 5. Продажи по месяцамначните с общей картины, выручки за каждый год: столбцыyear,order_count(число оплаченных заказов) иrevenue, отсортированные по году:year order_count revenue 2024 14 605 2025 14 595 - 2
Под ним покажите 2025 год по месяцам: столбцы
month(в виде'YYYY-MM'),order_countиrevenue, только для заказов 2025 года, отсортированные по месяцу. Результат начинается так:month order_count revenue 2025-02 1 35 2025-03 1 40 2025-04 1 40 … … …