Je suppose que la raison pour laquelle vous souhaitez éliminer la sous-requête est d'éviter d'analyser deux fois la table des utilisateurs. Rappelez-vous que le total est la somme des décomptes pour chaque pays.
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;
Cette requête construit un petit CTE avec les statistiques par pays. Il n'analysera la table des utilisateurs qu'une seule fois et générera un petit ensemble de résultats (une seule ligne par pays).
Le total (SELECT sum(cnt) FROM c) est calculé une seule fois sur ce petit ensemble de résultats, il utilise donc un temps négligeable.
Vous pouvez aussi utiliser une fonction fenêtre :
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;
(qui est la même que la requête de nightwolf avec les erreurs supprimées lol )
Les deux requêtes prennent à peu près le même temps.