Saya kira alasan Anda ingin menghilangkan subquery adalah untuk menghindari pemindaian tabel pengguna dua kali. Ingat totalnya adalah jumlah hitungan untuk setiap negara.
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;
Kueri ini membuat CTE kecil dengan statistik per negara. Ini hanya akan memindai tabel pengguna satu kali, dan menghasilkan kumpulan hasil kecil (hanya satu baris per negara).
Total (SELECT sum(cnt) FROM c) dihitung hanya sekali pada kumpulan hasil kecil ini, sehingga menggunakan waktu yang dapat diabaikan.
Anda juga dapat menggunakan fungsi jendela :
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;
(yang sama dengan kueri nightwolf dengan kesalahan yang dihapus lol )
Kedua kueri membutuhkan waktu yang hampir bersamaan.