Myslím, že důvodem, proč chcete odstranit poddotaz, je vyhnout se dvakrát skenování tabulky uživatelů. Pamatujte, že součet je součet počtů pro každou zemi.
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;
Tento dotaz vytváří malý CTE se statistikami pro jednotlivé země. Ta prohledá tabulku uživatelů pouze jednou a vygeneruje malou sadu výsledků (pouze jeden řádek na zemi).
Součet (SELECT sum(cnt) FROM c) se na této malé množině výsledků vypočítá pouze jednou, takže zabere zanedbatelný čas.
Můžete také použít funkci okna :
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;
(což je stejné jako dotaz nightwolf s odstraněnými chybami lol )
Oba dotazy trvají přibližně stejně dlouho.