Jag antar att anledningen till att du vill eliminera underfrågan är att undvika att skanna användartabellen två gånger. Kom ihåg att summan är summan av antalet för varje 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;
Den här frågan bygger en liten CTE med statistik per land. Den skannar bara användartabellen en gång och genererar en liten resultatuppsättning (endast en rad per land).
Summan (SELECT summa(cnt) FROM c) beräknas endast en gång på denna lilla resultatuppsättning, så den använder försumbar tid.
Du kan också använda en fönsterfunktion :
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;
(vilket är detsamma som nightwolfs fråga med felen borttagna lol )
Båda frågorna tar ungefär samma tid.