Как посчитать Fill Rate в SQL
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 — более детальная.
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. Одна отгрузка или несколько. Заказ доставлен в два захода — считать его полностью выполненным? Да, если суммарно отгружено не меньше, чем заказано.
Связанные темы
- Как посчитать inventory turnover в SQL
- Как посчитать on-time delivery в SQL
- Как посчитать sell-through rate в SQL
- Как посчитать cart abandonment в SQL
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 — вся.