Immagino che il motivo per cui desideri eliminare la sottoquery sia evitare di scansionare due volte la tabella degli utenti. Ricorda che il totale è la somma dei conteggi per ogni paese.
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;
Questa query crea un piccolo CTE con le statistiche per paese. Analizzerà la tabella degli utenti solo una volta e genererà un piccolo set di risultati (solo una riga per paese).
Il totale (SELECT sum(cnt) FROM c) viene calcolato solo una volta su questo piccolo set di risultati, quindi utilizza un tempo trascurabile.
Potresti anche usare una funzione finestra :
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;
(che è la stessa della query di nightwolf con gli errori rimossi lol )
Entrambe le query richiedono all'incirca lo stesso tempo.