← Все вопросы

Как посчитать долю/процент заказов в каждом статусе от общего числа?

Задан 12 месяцев назад559 просмотров2 ответа
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). Чуть длиннее, но работает везде.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект