小值的 SQLite 百分比

SQLite percentages with small values

所以我有这个 table 的用户订阅者和他们所在的国家/地区。

UserID | Name              | Country
-------+-------------------+------------
1      | Zaphod Beeblebrox | UK
2      | Arthur Dent       | UK
3      | Gene Kelly        | USA
4      | Nat King Cole     | USA

我需要按每个国家/地区的百分比列出所有用户。我还需要将所有较小的成员国(低于 1%)归入 "OTHERS" 类别。

我可以用

轻松完成一个简单的 "top x" 成员
SELECT COUNTRY, COUNT(*) AS POPULATION FROM SUBSCRIBERS GROUP BY COUNTRY ORDER BY POPULATION DESC LIMIT 10

并且可以通过 PHP 服务器端代码生成百分比,但我不太清楚如何:

  1. 在SQL中完成所有操作,包括直接在结果中计算百分比
  2. 将所有不足 1% 的成员归为一个 OTHERS 类别。

所以我需要这样的东西:

Country | Population
--------+-----------
USA     | 25.4%
Brazil  | 12%
UK      | 5%
OTHERS  | 65%

感谢您的帮助!

这是对此的查询,我使用子查询来计算总行数,然后使用它来获取每行的百分比值。 'Others' 类别是在单独的查询中生成的。行按人口降序排序,其他行排在最后。

SELECT * FROM 
    (SELECT country , ROUND((100.0*COUNT(*)/count_all),1) ||'%' AS population
     FROM (SELECT count(*) count_all FROM subscribers) AS sq,
     subscribers s
     WHERE (SELECT 100*count(*)/count_all 
            FROM subscribers s2 
            WHERE s2.country = s.country) > 1
     GROUP BY country
     ORDER BY population DESC)
UNION ALL
SELECT 'OTHERS', IFNULL(ROUND(100.0*COUNT(*)/count_all,1),0.0) ||'%' AS population
FROM (SELECT count(*) count_all FROM subscribers) AS sq,
     subscribers s
WHERE (SELECT 100*count(*)/count_all 
       FROM subscribers s2 
       WHERE s2.country = s.country) <= 1

好吧,我想我可能找到了一种执行速度快得多的方法:

SELECT territory,
       Round(Sum(percentage), 3) AS Population
FROM (SELECT
           Round((Count(*)*100.0)/(SELECT Count(*) FROM subscribers),3) AS Percentage,
           CASE
             WHEN ((Count(*)*100.0)/(SELECT Count(*) FROM subscribers)) > 2 THEN
             country
             ELSE 'Other'
           END AS Territory
      FROM   subscribers
      GROUP  BY country
      ORDER  BY percentage DESC)
GROUP  BY territory
ORDER  BY population DESC;