Процент дозвона по дням
Условие
Дана таблица calls со следующей структурой:
- call_id (INT) — идентификатор звонка
- call_date (DATE) — дата звонка
- dozv_flg (INT) — флаг дозвона (1 — дозвонились, 0 — не дозвонились)
Напишите SQL-запрос, который выведет процент дозвона для каждого дня за период с 01.10.2024 по текущий день.
Требования
- Процент рассчитывается как доля принятых звонков (dozv_flg=1) от всех поступивших звонков
- Результат округлить до 2 знаков после запятой
- Отсортировать по дате
Ожидаемый формат вывода
| call_date | call_count | success_count | success_rate |
|---|---|---|---|
| 2024-10-01 | 100 | 75 | 75.00 |
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Задача требует расчета процента успешных звонков (дозвонов) для каждого дня в указанном периоде. Необходимо вычислить долю звонков с флагом 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 с таблицей-календарём для полноты данных по всему периоду.