MySQL:计算百分比,如果百分比小于1%,则将它们分组并更改标签

时间:2019-10-23 13:06:40

标签: mysql sql

这是我用来获取参加活动的国家/地区所占百分比的查询:

SELECT count(p.id) as count, round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) as percentage, p.Nationality
FROM participants as p
JOIN participants_events as pe  on p.id = pe.participant_id
GROUP BY p.Nationality

哪个返回这样的表:

+-------+------------+-------------+
| count | percentage | Nationality |
+-------+------------+-------------+
|   100 |        0.8 | Albania     |
|   114 |        0.9 | Algeria     |
|   273 |        2.2 | Belgium     |
|   ... |        ... | ...         |
+-------+------------+-------------+

我要修改查询,以便不显示任何百分比小于1%的行,而是汇总其数量,并使用新百分比将其添加为“其他”。因此,使用新查询,结果将是:

+-------+------------+-------------+
| count | percentage | Nationality |
+-------+------------+-------------+
|   214 |        1.7 | Other       |
|   273 |        2.2 | Belgium     |
|   ... |        ... | ...         |
+-------+------------+-------------+

3 个答案:

答案 0 :(得分:2)

使用子查询:

SELECT (CASE WHEN count < 0.01 * total THEN 'Other'
             ELSE Nationality
        END) as new_Nationality,
       SUM(count),
       ROUND(100 * SUM(count) / total , 1) as percentage
FROM (SELECT p.Nationality,
             count(*) as count,
             SUM(COUNT(*)) OVER () as total
     FROM participants p JOIN
          participants_events pe
          on p.id = pe.participant_id
     GROUP BY p.Nationality
    )  p
GROUP BY new_Nationality, total
ORDER BY 2 DESC;

答案 1 :(得分:1)

尝试使用Having子句:

SELECT count(p.id) as count
       , round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) as percentage
       , p.Nationality
FROM participants as p
JOIN participants_events as pe  
     on p.id = pe.participant_id
GROUP BY p.Nationality
HAVING round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) > 1

编辑

对于第二部分,请尝试将第一部分的结果与小于1的百分比之和相结合。

SELECT count(p.id) as count
       , round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) as percentage
       , p.Nationality
FROM participants as p
JOIN participants_events as pe  
     on p.id = pe.participant_id
GROUP BY p.Nationality
HAVING round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) > 1

UNION

SELECT SUM(A.count) As count,
       SUM (A.percentage) As percentage,
       'OTHER'
FROM (SELECT count(p.id) as count
       , round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) as percentage
       , p.Nationality
       FROM participants as p
       JOIN participants_events as pe  
       on p.id = pe.participant_id
       GROUP BY p.Nationality
       HAVING round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) <= 1
       ) A

答案 2 :(得分:1)

请检查您的初始查询以使用相同的集合:

因此,从修改您的初始查询:

SELECT count(p.id) as count, round(100*count(p.id)/(SELECT count(p.id) FROM participants as p),1) as percentage, p.Nationality
FROM participants as p
JOIN participants_events as pe  on p.id = pe.participant_id
GROUP BY p.Nationality

TO

SELECT count(p.id) as count, round(100*count(p.id)/(SELECT count(p.id) FROM participants as p JOIN participants_events as pe  on p.id = pe.participant_id),1) as percentage, p.Nationality
FROM participants as p
JOIN participants_events as pe  on p.id = pe.participant_id
GROUP BY p.Nationality

所以i.signori的答案将是:

SELECT count(p.id) as count
       , 100*count(p.id)/(SELECT count(p.id) FROM participants as p JOIN participants_events as pe  
     on p.id = pe.participant_id) as percentage
       , p.Nationality
FROM participants as p
JOIN participants_events as pe  
     on p.id = pe.participant_id
GROUP BY p.Nationality
HAVING 100*count(p.id)/(SELECT count(p.id) FROM participants as p JOIN participants_events as pe  
     on p.id = pe.participant_id) > 1

UNION

SELECT SUM(A.count) As count,
       SUM(A.percentage) As percentage,
       'Other'
FROM (SELECT count(p.id) as count
       , 100*count(p.id)/(SELECT count(p.id) FROM participants as p JOIN participants_events as pe  
     on p.id = pe.participant_id) as percentage
       , p.Nationality
       FROM participants as p
       JOIN participants_events as pe  
       on p.id = pe.participant_id
       GROUP BY p.Nationality
       HAVING 100*count(p.id)/(SELECT count(p.id) FROM participants as p JOIN participants_events as pe  
     on p.id = pe.participant_id) <= 1
       ) A