Я думаю, что причина, по которой вы хотите исключить подзапрос, состоит в том, чтобы избегать сканирования таблицы пользователей дважды.Помните, что общая сумма представляет собой сумму подсчетов для каждой страны.
WITH c AS (SELECT country_id, count(*) AS cnt FROM users WHERE cond1=... GROUP BY country_id)
SELECT *, 100.0*cnt/(SELECT sum(cnt) FROM c) AS percent FROM c;
Этот запрос создает небольшой CTE со статистикой по стране.Он будет сканировать таблицу пользователей только один раз и сгенерирует небольшой набор результатов (только одна строка на страну).
Общая сумма (SELECT sum (cnt) FROM c) рассчитывается только один раз для этого небольшого набора результатов,поэтому он использует незначительное время.
Вы также можете использовать оконную функцию:
SELECT country_id, cnt, 100.0*cnt/(sum(cnt) OVER ()) AS percent
FROM (SELECT country_id, count(*) as cnt from users group by country_id) foo;
(что совпадает с запросом ночного волка с удаленными ошибками lol)
Оба запроса занимают примерно одно и то же время.