サブクエリを削除する理由は、usersテーブルを2回スキャンしないようにするためだと思います。合計は各国のカウントの合計であることを忘れないでください。
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を構築します。ユーザーテーブルを1回だけスキャンし、小さな結果セットを生成します(国ごとに1行のみ)。
合計(SELECT sum(cnt)FROM c)は、この小さな結果セットで1回だけ計算されるため、使用する時間はごくわずかです。
ウィンドウ関数を使用することもできます:
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;
(これは、エラーが削除されたナイトウルフのクエリと同じですlol)
両方のクエリにほぼ同じ時間がかかります。