这是我用来获取参加活动的国家/地区所占百分比的查询:
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 |
| ... | ... | ... |
+-------+------------+-------------+
答案 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