Как посчитать Fill Rate в SQL

Проверь себя · 1/3разбор после ответа
В таблице событий поле event_date_text хранит дату как текст в формате YYYY-MM-DD. Вы хотите фильтровать строки за прошлую неделю и группировать по неделе. Что логичнее всего сделать в запросе?

Зачем Fill Rate

Клиент заказал 5 SKU, а в наличии только 4. Заказ выполнен частично — Fill Rate 80%. Если так происходит регулярно, клиенты уходят к конкурентам, у которых товар всегда в наличии.

Формула

Order Fill Rate = orders_fulfilled_complete / total_orders × 100%
Unit Fill Rate = units_delivered / units_ordered × 100%
Line Fill Rate = order_lines_delivered_complete / total_order_lines × 100%

Базовый расчёт

Данные: order_lines(order_id, sku, qty_ordered, qty_delivered).

SELECT
    DATE_TRUNC('week', order_date) AS week,
    COUNT(*) AS total_lines,
    COUNT(*) FILTER (WHERE qty_delivered >= qty_ordered) AS lines_complete,
    SUM(qty_ordered) AS total_units,
    SUM(qty_delivered) AS units_delivered,
    SUM(qty_delivered)::NUMERIC * 100 / NULLIF(SUM(qty_ordered), 0) AS unit_fill_rate_pct,
    COUNT(*) FILTER (WHERE qty_delivered >= qty_ordered)::NUMERIC * 100 / NULLIF(COUNT(*), 0) AS line_fill_rate_pct
FROM order_lines
WHERE order_date >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1;

Line vs Unit Fill Rate

Line fill — доля полностью укомплектованных строк заказа. Unit fill — доля отгружённых единиц товара.

-- Order: 5 lines, 4 complete, 1 partial (50 of 100)
-- Line fill = 4/5 = 80%
-- Unit fill = ((100*4) + 50) / ((100*5)) = 90%

Line-метрика строже, unit — более детальная.

Закрепи формулу fill rate в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать fill rate в Telegram

Stock-out Rate

SELECT
    sku,
    COUNT(*) AS total_lines,
    COUNT(*) FILTER (WHERE qty_delivered < qty_ordered) AS partial_or_zero,
    COUNT(*) FILTER (WHERE qty_delivered = 0) AS stockouts
FROM order_lines
WHERE order_date >= CURRENT_DATE - INTERVAL '30 days'
GROUP BY sku
HAVING COUNT(*) FILTER (WHERE qty_delivered < qty_ordered) > 0
ORDER BY stockouts DESC
LIMIT 50;

SKU с самыми частыми stock-out — приоритет на дозаказ.

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

Ошибка 1. Отменённые заказы. Отменённые заказы не входят в знаменатель fill rate. Их нужно исключить.

Ошибка 2. Дозаказы (back-orders). Заказ частично выполнен сегодня, остаток отгружен в следующем месяце. Считать по дате заказа или по дате отгрузки?

Ошибка 3. Замены товара. Бренда A не было, клиент согласился на бренд B. Считать заказ выполненным? Обычно засчитывают, но с пометкой.

Ошибка 4. Выбор окна. Fill rate за неделю и за месяц — разные цифры.

Ошибка 5. Одна отгрузка или несколько. Заказ доставлен в два захода — считать его полностью выполненным? Да, если суммарно отгружено не меньше, чем заказано.

Связанные темы

FAQ

Какой Fill Rate считается нормальным?

Ориентиры зависят от отрасли: в e-commerce нормой считают 95%+, в B2B — 98%+. В фарме и здравоохранении планка выше, 99%+, потому что цена недопоставки критична.

Line или Unit Fill Rate?

Line fill строже и отражает взгляд клиента: заказ либо укомплектован полностью, либо нет. Unit fill — операционная метрика, она показывает, какую долю единиц удалось отгрузить. Для оценки клиентского опыта смотрят на line, для склада — на unit.

Fill Rate падает — что делать?

Первым делом улучшают планирование запасов и точность прогноза спроса. Дальше диверсифицируют поставщиков, чтобы не зависеть от одного, и пересматривают точки дозаказа. Обычно проблема сидит в одном-двух звеньях этой цепочки.

Как учитывать замены товара?

Замены лучше считать отдельно. Если клиент согласился на замену — заказ считается выполненным, если отказался — это stock-out. Так вы не смешиваете реальную недопоставку с успешной заменой.

Чем Fill Rate отличается от Perfect Order Rate?

Fill Rate смотрит только на то, какую долю заказанного отгрузили. Perfect Order Rate строже: заказ засчитывается идеальным, только если он доставлен вовремя, полностью, без повреждений и с правильными документами. Fill Rate — часть картины, Perfect Order — вся.