Предполагам, че причината, поради която искате да премахнете подзаявката, е да избегнете сканирането на таблицата с потребители два пъти. Не забравяйте, че общата сума е сумата от броя за всяка страна.
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;
(което е същото като заявката на nightwolf с премахнати грешки хахахахахахахахахахаха!)
И двете заявки отнемат приблизително едно и също време.