Как посчитать Win Rate в SQL
users.phone иногда попадают значения с ведущими/хвостовыми пробелами. Вы фильтруете WHERE phone = '+79991234567', но часть пользователей не находится. Как исправить фильтр?Содержание:
Зачем Win Rate
В B2B sales главная метрика — Win Rate. Если по 100 квалифицированным лидам закрывается 20 сделок — это 20%. Падение на 5 п.п. — серьёзный сигнал: либо лиды стали хуже, либо команда продаёт хуже, либо продукт не догоняет конкурентов.
Что такое Win Rate
Win Rate — доля выигранных сделок от общего числа закрытых.
Win Rate = won_deals / (won_deals + lost_deals) × 100%Считают на закрытых сделках (открытые и в процессе не учитывают).
Базовый расчёт
Данные: deals(deal_id, status, sales_rep, value, closed_at).
SELECT
COUNT(*) FILTER (WHERE status = 'won') AS won,
COUNT(*) FILTER (WHERE status = 'lost') AS lost,
COUNT(*) FILTER (WHERE status = 'won')::NUMERIC * 100
/ NULLIF(COUNT(*) FILTER (WHERE status IN ('won','lost')), 0) AS win_rate_pct
FROM deals
WHERE closed_at >= '2026-01-01'
AND closed_at < '2026-05-01';Важно: открытые сделки исключаются. Иначе Win Rate занижен.
Win Rate по менеджерам
SELECT
sales_rep,
COUNT(*) FILTER (WHERE status = 'won') AS won,
COUNT(*) FILTER (WHERE status = 'lost') AS lost,
COUNT(*) FILTER (WHERE status = 'won')::NUMERIC * 100
/ NULLIF(COUNT(*) FILTER (WHERE status IN ('won','lost')), 0) AS win_rate_pct,
SUM(value) FILTER (WHERE status = 'won') AS revenue
FROM deals
WHERE closed_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY sales_rep
HAVING COUNT(*) FILTER (WHERE status IN ('won','lost')) >= 10
ORDER BY win_rate_pct DESC;HAVING >= 10 отсекает менеджеров с малой выборкой.
По сегментам
SELECT
deal_size_segment,
industry,
COUNT(*) FILTER (WHERE status = 'won') AS won,
COUNT(*) FILTER (WHERE status = 'won')::NUMERIC * 100
/ NULLIF(COUNT(*) FILTER (WHERE status IN ('won','lost')), 0) AS win_rate
FROM deals
WHERE closed_at >= CURRENT_DATE - INTERVAL '180 days'
GROUP BY deal_size_segment, industry
ORDER BY win_rate DESC;Частые ошибки
Ошибка 1. Включать открытые сделки в знаменатель. В CRM есть «открытые» сделки. В Win Rate они не считаются — иначе показатель занижен.
Ошибка 2. Считать только won без lost.
won / total_deals_started — это не Win Rate, а конверсия. Используйте won / (won+lost).
Ошибка 3. Не учитывать стадию сделки. Сделка на стадии «discovery» и на стадии «contract» — это разная зрелость. Win Rate в разбивке по стадиям полезнее.
Ошибка 4. Среднее по менеджерам без взвешивания. Менеджер с одной сделкой и Win Rate 100% выглядит лучше менеджера с 50 сделками и 60%. Взвешивайте по объёму.
Ошибка 5. Не учитывать сумму сделки. Win Rate 20% на сделках по $1M лучше, чем Win Rate 50% на $10K. Смотрите на показатель, взвешенный по выручке.
Ошибка 6. Сделки на стыке кварталов. Сделка стартовала в Q1, закрылась в Q2 — в какой период её учитывать? Договоритесь заранее.
Связанные темы
- Как посчитать conversion в SQL
- Как посчитать funnel в SQL
- Как посчитать ROAS в SQL
- Как посчитать unit-economics в SQL
FAQ
Какой Win Rate считается хорошим?
Для B2B SaaS хороший показатель — 15-25% от MQL. Для Enterprise — 20-40% от SQL. Точная планка сильно зависит от качества лидов.
Win Rate упал — что делать?
Разложите падение на составляющие: качество лидов (стали приходить плохие лиды), работа отдела продаж (как отрабатывают менеджеры) и продукт с конкурентами. Обычно проблема прячется в одной из этих трёх зон.
Win Rate или Conversion Rate?
Conversion Rate считается на уровне всей воронки, а Win Rate — только на уровне закрытых сделок. Первая метрика про то, сколько лидов вообще дошло до сделки, вторая — про то, сколько из закрытых сделок выиграно.
Win Rate по стадиям?
Полезная разбивка. Вероятность Stage 1 → Won ниже, а Stage 4 → Won выше, потому что чем дальше сделка по воронке, тем больше шанс её закрыть.
Прогнозный Win Rate?
Историческую Win Rate умножают на открытый pipeline и получают прогноз выручки. Это удобный способ прикинуть, сколько денег принесут сделки, которые сейчас в работе.