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

Процент дозвона по дням

2.0 Middle🔥 191 комментариев
#SQL и базы данных#Метрики и KPI

Условие

Дана таблица calls со следующей структурой:

  • call_id (INT) — идентификатор звонка
  • call_date (DATE) — дата звонка
  • dozv_flg (INT) — флаг дозвона (1 — дозвонились, 0 — не дозвонились)

Напишите SQL-запрос, который выведет процент дозвона для каждого дня за период с 01.10.2024 по текущий день.

Требования

  • Процент рассчитывается как доля принятых звонков (dozv_flg=1) от всех поступивших звонков
  • Результат округлить до 2 знаков после запятой
  • Отсортировать по дате

Ожидаемый формат вывода

call_datecall_countsuccess_countsuccess_rate
2024-10-011007575.00

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Решение

Задача требует расчета процента успешных звонков (дозвонов) для каждого дня в указанном периоде. Необходимо вычислить долю звонков с флагом dozv_flg = 1 от общего количества звонков в день.

Подход к решению

Этап 1: Группируем звонки по дате.

Этап 2: Подсчитываем общее количество звонков в день.

Этап 3: Подсчитываем количество успешных звонков (dozv_flg = 1).

Этап 4: Рассчитываем процент успешности.

SQL-запрос

SELECT 
  call_date,
  COUNT(*) AS call_count,
  SUM(dozv_flg) AS success_count,
  ROUND(
    CAST(SUM(dozv_flg) AS NUMERIC) / COUNT(*) * 100, 
    2
  ) AS success_rate
FROM calls
WHERE call_date >= '2024-10-01'
GROUP BY call_date
ORDER BY call_date ASC;

Пошаговое объяснение

1. Выбор столбцов

  • call_date — дата звонка для группировки
  • COUNT(*) — общее количество звонков в день
  • SUM(dozv_flg) — сумма флагов дозвонов (количество успешных, так как dozv_flg = 0 или 1)
  • ROUND(..., 2) — округление до 2 знаков после запятой

2. Расчет процента

  • Делим количество успешных звонков на общее количество
  • Умножаем на 100 для получения процентов
  • CAST(...AS NUMERIC) — преобразуем в число для корректного деления

3. WHERE условие

  • call_date >= '2024-10-01' — фильтруем только звонки с 1 октября 2024
  • Если нужно учитывать только звонки до текущего дня, добавьте: AND call_date <= CURRENT_DATE

4. Сортировка

  • ORDER BY call_date ASC — выводим результаты в хронологическом порядке

Альтернативный вариант (явное условие для текущей даты)

SELECT 
  call_date,
  COUNT(*) AS call_count,
  SUM(dozv_flg) AS success_count,
  ROUND(
    CAST(SUM(dozv_flg) AS NUMERIC) / COUNT(*) * 100, 
    2
  ) AS success_rate
FROM calls
WHERE call_date >= '2024-10-01' AND call_date <= CURRENT_DATE
GROUP BY call_date
ORDER BY call_date ASC;

Пример расчёта

Для дня 2024-10-01:

  • Всего звонков: 100
  • Успешных (dozv_flg = 1): 75
  • Процент успеха: (75 / 100) * 100 = 75.00%

Важные моменты

CAST to NUMERIC — критически важен для корректного деления

SUM(dozv_flg) вместо COUNT — простой способ подсчёта единиц

Границы периода — запрос фильтрует данные с 1 октября

Обработка дней без звонков — если требуется вывести все дни периода, потребуется JOIN с таблицей-календарём для полноты данных по всему периоду.

Процент дозвона по дням | PrepBro