SQLite проценты с небольшими значениями - PullRequest
0 голосов
/ 16 мая 2018

Итак, у меня есть таблица подписчиков пользователей и страны, в которой они находятся.

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

Мне нужно составить список всех пользователей в процентах от каждой из стран.Мне также нужно, чтобы все более мелкие страны-члены (менее 1%) были отнесены к категории «ДРУГИЕ».

Я могу выполнить простой "top x" членов тривиально с помощью

SELECT COUNTRY, COUNT(*) AS POPULATION FROM SUBSCRIBERS GROUP BY COUNTRY ORDER BY POPULATION DESC LIMIT 10

и могу генерировать проценты с помощью PHP-кода на стороне сервера, но я не совсем знаю, как:

  1. Выполните все это в SQL, включая процентные вычисления непосредственно в результате.
  2. Объедините всех членов с процентом менее 1% в одну категорию ДРУГИЕ.

ИтакМне нужно что-то вроде этого:

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

Ценю помощь!

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Хорошо, я думаю, я мог бы найти способ сделать это намного быстрее по скорости выполнения:

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;
0 голосов
/ 17 мая 2018

Вот запрос для этого, я использовал подзапрос для подсчета общего количества строк, а затем использовал его, чтобы получить процентное значение для каждой.Категория «Другие» была создана в отдельном запросе.Строки отсортированы по убыванию численности, а строка «Другие» - последней.

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
...