ROUND(число, знаки) округляет число до заданного количества знаков после запятой (по умолчанию до целого). Аналитик применяет её постоянно — округлить процент конверсии, средний чек, долю до читаемого вида. Звучит просто, но именно на ROUND ловят подвох: округлять надо ПОСЛЕ деления, и деление должно быть дробным.
Синтаксис
ROUND(число, число_знаков)
Примеры использования
Пример 1: Процент конверсии до 1 знака
SELECT
ROUND(100.0 * converted / NULLIF(visitors, 0), 1) AS cr_pct
FROM funnel;
Результат:
cr_pct
24.6
Пример 2: Средний чек до копеек
SELECT category,
ROUND(AVG(amount), 2) AS avg_check
FROM orders
GROUP BY category;
Подвох №1: ROUND(converted / visitors, 2) при целых даст ROUND(0, 2) = 0, потому что деление целых округлилось ДО ROUND. Сначала сделай деление дробным (100.0 * или CAST), потом округляй. Подвох №2: правила округления .5 различаются — PostgreSQL для numeric использует банковское округление (к чётному); это иногда даёт неожиданную копейку в отчёте.
Где спрашивают на собеседовании
ROUND — в каждой задаче на проценты и деньги. Сам по себе он простой, но интервьюер смотрит, не округлил ли ты слишком рано и не потерял ли точность на целочисленном делении. Правильный порядок: деление (дробное) → умножение на 100 → ROUND.
FAQ: частые вопросы про ROUND
Почему ROUND возвращает 0 при делении?
Если оба операнда целые, деление округляется до целого ещё ДО ROUND (3/4 = 0), и ROUND(0, 2) = 0. Сделай числитель дробным: ROUND(100.0 * a / b, 1).
Как округлить до 2 знаков?
ROUND(значение, 2). Второй аргумент — число знаков после запятой; ROUND(x) без него округляет до целого.
Почему ROUND по-разному округляет .5?
Зависит от типа и СУБД: PostgreSQL для numeric применяет банковское округление (половина к ближайшему чётному), для double — арифметическое. Для стабильных денежных расчётов работай с типом numeric.