Ich denke, der Grund, warum Sie die Unterabfrage eliminieren möchten, besteht darin, zu vermeiden, dass die Benutzertabelle zweimal gescannt wird. Denken Sie daran, dass die Summe die Summe der Zählungen für jedes Land ist.
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;
Diese Abfrage erstellt einen kleinen CTE mit den Statistiken pro Land. Es scannt die Benutzertabelle nur einmal und generiert eine kleine Ergebnismenge (nur eine Zeile pro Land).
Die Summe (SELECT sum(cnt) FROM c) wird nur einmal für diese kleine Ergebnismenge berechnet, sodass sie vernachlässigbar viel Zeit in Anspruch nimmt.
Sie könnten auch eine Fensterfunktion verwenden :
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;
(Das ist dasselbe wie die Abfrage von Nightwolf, bei der die Fehler entfernt wurden, lol )
Beide Abfragen dauern ungefähr gleich lang.