Surrika

Как проверить пропуски в данных по продажам по дням

В выгрузке продаж строка появляется только при продаже, поэтому день без строк не виден в сумме выручки. Проверка строится от последней даты: вы собираете календарь за 12 месяцев, сравниваете его с датами продаж и считаете пропуски по месяцам.

Отчеты и данные

Как считать

  1. Вы берете последнюю дату в продажах и отсчитываете от нее 12 месяцев назад.
  2. Строите полный календарь на этот период по дням.
  3. Присоединяете к календарю дни, где есть хотя бы одна строка продаж.
  4. Дни без строк считаете пропусками, дни со строками и нулевой суммой выручки отмечаете отдельно.
  5. Сворачиваете результат по месяцам и считаете долю пропусков.

Расчет на выгрузках магазина

Пример посчитан на выгрузках вымышленного мебельного магазина: продажи сайта и трех маркетплейсов, реклама, сделки CRM и остатки за 2024-2025 годы.

В выгрузке продаж за последний год не хватает некоторых дат. Как проверить, какие дни выпали и где выручка стоит на нуле?

Пропуски и нулевые дни по месяцам

SQL, по которому посчитано

WITH bounds AS (
  SELECT max(date) AS max_date
  FROM sales
),
calendar AS (
  SELECT CAST(day AS DATE) AS date
  FROM bounds b
  CROSS JOIN LATERAL generate_series(
    CAST(b.max_date - INTERVAL 12 MONTH + INTERVAL 1 DAY AS DATE),
    CAST(b.max_date AS DATE),
    INTERVAL 1 DAY
  ) AS t(day)
),
sales_by_day AS (
  SELECT s.date, SUM(s.revenue) AS revenue
  FROM sales s, bounds b
  WHERE s.date > b.max_date - INTERVAL 12 MONTH
    AND s.date <= b.max_date
  GROUP BY s.date
),
joined AS (
  SELECT c.date,
         CASE WHEN s.date IS NULL THEN 0 ELSE 1 END AS has_sales,
         CASE WHEN s.date IS NOT NULL AND COALESCE(s.revenue, 0) = 0 THEN 1 ELSE 0 END AS zero_revenue
  FROM calendar c
  LEFT JOIN sales_by_day s ON s.date = c.date
)
SELECT date_trunc('month', date)::DATE AS month,
       COUNT(*) AS calendar_days,
       SUM(has_sales) AS days_with_sales,
       COUNT(*) - SUM(has_sales) AS missing_days,
       SUM(zero_revenue) AS zero_revenue_days,
       ROUND((COUNT(*) - SUM(has_sales))::DOUBLE / COUNT(*), 3) AS missing_share
FROM joined
GROUP BY 1
ORDER BY 1

Откуда берутся пропуски в продажах

В продажах хранятся только дни, когда были продажи хотя бы по одному каналу или артикулу. Если за день не было ни одной строки, в выгрузке этого дня нет, и сумма по месяцу может выглядеть ниже без объяснения. Последняя дата задает границу расчета: от нее отсчитываются 12 месяцев, чтобы сравнивать одинаковые периоды. Для проверки нужен полный календарь по дням.

Как считать пропуски и нулевые дни

Сначала строится календарь на 12 месяцев от последней даты в продажах. Затем к календарю присоединяются дни, где есть продажи, и каждый день получает признак: есть продажи или нет. Пропуском считается дата из календаря без строк продаж. Нулевым днем считается дата со строками, где сумма выручки равна 0, например при полной скидке. Результат сворачивается по месяцам: число календарных дней, дни с продажами, пропуски, нулевые дни и доля пропусков.

Как читать результат по месяцам

Сравнивайте число календарных дней с числом дней, где есть продажи: разница показывает пропуски. Доля пропусков выше 0,1 означает, что в месяце не хватает более 10 процентов дней, и отчет по этому месяцу может быть неполным. Нулевые дни смотрятся отдельно от пропусков: строки есть, но выручка равна 0. Если пропуски приходятся на начало или конец периода, проверьте границы выгрузки и последнюю дату. Ровные пропуски по выходным или праздникам часто связаны с календарем магазина.

Что делать с найденными пропусками

Сначала проверьте, не обрезана ли выгрузка по датам: последняя дата в продажах должна совпадать с датой, на которую вы строите отчет. Затем найдите каналы и артикулы, где нет строк в дни, которые должны были работать. Если магазин работал, а строк нет, запросите повторную выгрузку из источника за эти даты. Для дней с нулевой выручкой проверьте скидки, возвраты и служебные операции, чтобы не принять их за отсутствие продаж. После исправления пересчитайте пропуски и зафиксируйте правило проверки в регулярном отчете.

Частые ошибки

Считать отсутствие строки нулевой продажей

В продажах нет строк за день без продаж, поэтому сумма по датам не покажет этот день. Стройте календарь и сравнивайте его с датами продаж, иначе пропуски смешаются с нулями.

Брать неполный период

Если отрезать месяц по последней дате с продажами, конец периода может выглядеть полным. Считайте календарь от последней даты в данных и проверяйте, что он покрывает все 12 месяцев.

Игнорировать нулевую выручку в строках

День может быть в продажах, но с выручкой 0 из-за скидки или возврата. Отмечайте такие дни отдельно, иначе они исказят средний чек и конверсию.

Сравнивать месяцы с разным числом дней

В феврале и январе разное число календарных дней, поэтому абсолютные пропуски плохо сопоставимы. Смотрите долю пропусков и число дней с продажами вместе.

Вопросы

Почему в продажах нет строк за некоторые даты?

Строка появляется только при продаже хотя бы одного товара. День без продаж не попадает в выгрузку, поэтому его нужно находить через календарь.

Как отличить пропуск от нулевой продажи?

Пропуск: дата без строк в продажах. Нулевая продажа: дата со строками, где сумма выручки равна 0.

Сколько дней должно быть в месяце для проверки?

Берите все календарные дни месяца за последние 12 месяцев. Число дней с продажами сравнивайте с календарем, потому что в один день может быть несколько строк.

Что делать, если пропуски только по одному каналу?

Проверьте работу канала и выгрузку за эти даты. Общий календарь покажет пропуск по всем продажам, а для одного канала нужен такой же календарь с фильтром по каналу.

Можно ли считать пропуски по артикулам?

Да, если сравнивать календарь с датами продаж конкретного артикула. Для товаров с редкими продажами пропуски будут нормой, поэтому смотрите долю дней с продажами и интервал между ними.

Посчитайте это на своих выгрузках

Бросьте выгрузки на доску Surrika и задайте вопрос обычными словами. Ответ придет графиком, а под ним будет SQL, по которому он посчитан.

14 дней бесплатно, карта не нужна.

По теме

Все задачи