Tôi đoán lý do bạn muốn loại bỏ truy vấn con là để tránh quét bảng người dùng hai lần. Hãy nhớ tổng số là tổng số lượng cho mỗi quốc gia.
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;
Truy vấn này xây dựng một CTE nhỏ với thống kê theo từng quốc gia. Nó sẽ chỉ quét bảng người dùng một lần và tạo ra một tập hợp kết quả nhỏ (chỉ một hàng cho mỗi quốc gia).
Tổng (SELECT sum (cnt) FROM c) chỉ được tính một lần trên tập kết quả nhỏ này, vì vậy nó sử dụng thời gian không đáng kể.
Bạn cũng có thể sử dụng một hàm cửa sổ:
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;
(giống như truy vấn của nightwolf với các lỗi đã được loại bỏ lol)
Cả hai truy vấn mất khoảng thời gian như nhau.