← Все вопросы
Как посчитать долю/процент заказов в каждом статусе от общего числа?
14
В orders есть колонка status. Хочу не просто COUNT(*) GROUP BY status, а сразу долю каждого статуса в процентах от всех заказов. Как поделить количество в группе на общее количество?
2 ответа
23
✓ Принятый ответ — помог автору
Делишь количество в группе на общее количество. Общее берём оконной функцией SUM(...) OVER () (без PARTITION — значит по всей таблице):
SELECT status,
COUNT(*) AS cnt,
ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct
FROM orders
GROUP BY status;
Хитрость с 100.0 * — чтобы деление было дробным, а не целочисленным (иначе получишь нули). SUM(COUNT(*)) OVER () суммирует все групповые counts = общее число строк.
Nick Dolbnya именно 100.0, а не 100 — на этом многие спотыкаются и видят 0% · 12 месяцев назад
7
Если оконные функции недоступны, можно подзапросом в знаменателе: ... / (SELECT COUNT(*) FROM orders). Чуть длиннее, но работает везде.
Ваш ответ
Войдите, чтобы ответить на вопрос.