← Назад к вопросам

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 рабочих дней.

SQL: Расчет среднего чека по дням недели | PrepBro