← Назад к вопросам
SQL: Расчет среднего чека по дням недели
1.0 Junior🔥 281 комментариев
#SQL и базы данных#Метрики продукта
Условие
У вас есть таблица orders:
- order_id (integer)
- customer_id (integer)
- order_date (date)
- total_amount (decimal)
Посчитайте средний чек по дням недели.
Ожидаемый результат:
Таблица с колонками:
- day_of_week (название дня недели)
- orders_count
- avg_order_amount
- total_revenue
Отсортируйте по дням недели (понедельник - воскресенье).
Источник: типовая задача на собеседованиях аналитиков
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Расчет среднего чека по дням недели
Решение на PostgreSQL:
SELECT
TO_CHAR(order_date, 'Day') AS day_of_week,
COUNT(*) AS orders_count,
ROUND(AVG(total_amount)::numeric, 2) AS avg_order_amount,
ROUND(SUM(total_amount)::numeric, 2) AS total_revenue
FROM orders
GROUP BY TO_CHAR(order_date, 'Day')
ORDER BY
CASE WHEN TO_CHAR(order_date, 'Day') = 'Monday' THEN 1
WHEN TO_CHAR(order_date, 'Day') = 'Tuesday' THEN 2
WHEN TO_CHAR(order_date, 'Day') = 'Wednesday' THEN 3
WHEN TO_CHAR(order_date, 'Day') = 'Thursday' THEN 4
WHEN TO_CHAR(order_date, 'Day') = 'Friday' THEN 5
WHEN TO_CHAR(order_date, 'Day') = 'Saturday' THEN 6
WHEN TO_CHAR(order_date, 'Day') = 'Sunday' THEN 7
END;
Лучше с EXTRACT:
SELECT
CASE EXTRACT(DOW FROM order_date)
WHEN 0 THEN 'Sunday'
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
WHEN 3 THEN 'Wednesday'
WHEN 4 THEN 'Thursday'
WHEN 5 THEN 'Friday'
WHEN 6 THEN 'Saturday'
END AS day_of_week,
COUNT(*) AS orders_count,
ROUND(AVG(total_amount)::numeric, 2) AS avg_order_amount,
ROUND(SUM(total_amount)::numeric, 2) AS total_revenue
FROM orders
GROUP BY EXTRACT(DOW FROM order_date)
ORDER BY EXTRACT(DOW FROM order_date);
Для MySQL:
SELECT
CASE DAYOFWEEK(order_date)
WHEN 1 THEN 'Sunday'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Saturday'
END AS day_of_week,
COUNT(*) AS orders_count,
ROUND(AVG(total_amount), 2) AS avg_order_amount,
ROUND(SUM(total_amount), 2) AS total_revenue
FROM orders
GROUP BY DAYOFWEEK(order_date)
ORDER BY DAYOFWEEK(order_date);
Интерпретация результатов
Примерный результат:
day_of_week | orders_count | avg_order_amount | total_revenue
------------|--------------|------------------|---------------
Monday | 150 | 45.50 | 6825.00
Tuesday | 165 | 46.20 | 7623.00
Wednesday | 155 | 44.80 | 6944.00
Thursday | 170 | 47.30 | 8041.00
Friday | 195 | 50.20 | 9789.00
Saturday | 200 | 52.10 | 10420.00
Sunday | 160 | 48.50 | 7760.00
Вывод:
- Пятница-суббота - пиковые дни (больше заказов и выше средний чек)
- Среда - низкая активность
- Выходные имеют тенденцию к выскоким чекам
Дополнительный анализ: недели vs выходные
SELECT
CASE WHEN EXTRACT(DOW FROM order_date) IN (0, 6) THEN 'Weekend'
ELSE 'Weekday' END AS day_type,
COUNT(*) AS orders_count,
ROUND(AVG(total_amount)::numeric, 2) AS avg_order,
ROUND(SUM(total_amount)::numeric, 2) AS revenue
FROM orders
GROUP BY CASE WHEN EXTRACT(DOW FROM order_date) IN (0, 6) THEN 'Weekend'
ELSE 'Weekday' END;
Это показывает укрупненный паттерн выходных vs рабочих дней.