Ik denk dat de reden dat u de subquery wilt verwijderen, is om te voorkomen dat u de gebruikerstabel twee keer scant. Onthoud dat het totaal de som is van de tellingen voor elk land.
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;
Deze query bouwt een kleine CTE op met de statistieken per land. Het scant de gebruikerstabel slechts één keer en genereert een kleine resultatenset (slechts één rij per land).
Het totaal (SELECT sum(cnt) FROM c) wordt slechts één keer berekend voor deze kleine resultatenset, dus het kost verwaarloosbare tijd.
U kunt ook een vensterfunctie gebruiken:
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;
(wat hetzelfde is als de vraag van Nightwolf met de fouten verwijderd lol )
Beide zoekopdrachten duren ongeveer even lang.