如何将结果集中占比低于15%的记录合并为单行?
实现低占比记录合并的SQL方案
这是个非常典型的分组聚合需求,用SQL就能快速实现,我给你两种通用的方案,适配绝大多数关系型数据库(MySQL、PostgreSQL、SQL Server等):
方法一:使用CASE WHEN分组求和
这种方法通过对Name字段做条件映射,直接分组计算总和,代码简洁高效:
SELECT CASE WHEN Percentage < 15 THEN 'Everyone else' ELSE Name END AS Name, SUM(Percentage) AS Percentage FROM your_table_name GROUP BY CASE WHEN Percentage < 15 THEN 'Everyone else' ELSE Name END ORDER BY Percentage DESC;
逻辑说明:
- 条件映射:用
CASE语句把所有占比低于15%的记录统一标记为Everyone else,其余保留原名称 - 分组求和:按照标记后的名称分组,对
Percentage求和 - 排序优化:最后按占比降序排序,让结果和你预期的一致
方法二:拆分查询后合并结果
如果你觉得第一种方法的分组逻辑有点绕,也可以拆成两个查询,用UNION ALL合并结果,逻辑更直观:
-- 先取出占比>=15%的原始记录 SELECT Name, Percentage FROM your_table_name WHERE Percentage >= 15 UNION ALL -- 再计算所有占比<15%的记录总和 SELECT 'Everyone else' AS Name, SUM(Percentage) AS Percentage FROM your_table_name WHERE Percentage < 15 ORDER BY Percentage DESC;
注意点:
- 如果你的数据库中没有占比低于15%的记录,第二个查询会返回空行,这时可以给
SUM(Percentage)加个COALESCE来避免,比如COALESCE(SUM(Percentage), 0) - 优先用UNION ALL:
UNION ALL比UNION效率更高,因为它不会去重,这里我们的两个查询结果不会重复,所以用UNION ALL更合适
两种方法都能得到你想要的结果:
Name | Percentage
Everyone else| 17
Sam | 24
Elvis | 59
内容的提问来源于stack exchange,提问作者sam smith
相关产品推荐
相关产品推荐

