Myślę, że powodem, dla którego chcesz wyeliminować podzapytanie, jest uniknięcie dwukrotnego skanowania tabeli użytkowników. Pamiętaj, że suma jest sumą zliczeń dla każdego kraju.
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;
To zapytanie tworzy mały CTE ze statystykami dla poszczególnych krajów. Przeskanuje tabelę użytkowników tylko raz i wygeneruje mały zestaw wyników (tylko jeden wiersz na kraj).
Suma (SELECT sum(cnt) FROM c) jest obliczana tylko raz na tym małym zestawie wyników, więc wykorzystuje nieistotny czas.
Możesz także użyć funkcji okna :
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;
(co jest takie samo jak zapytanie nightwolf z usuniętymi błędami lol )
Oba zapytania zajmują mniej więcej ten sam czas.