SQL如何实现合并排名前2行之后的所有行并汇总数据
汽车销量排名合并后N行的SQL实现
场景说明
现有汽车销量排名表,需要按排名规则保留前2名的品牌明细,排名第3及以后的所有品牌合并为「others」,汇总其总销量。
假设原始表名为car_sales,字段定义如下:
car:汽车品牌名称sum_of_solds:品牌累计销量rank:品牌销量排名(数值越小排名越靠前)
实现SQL
用UNION ALL拼接两部分结果即可,第一部分取前2名明细,第二部分汇总其余品牌数据,最后统一排序保证结果顺序正确:
SELECT car, sum_of_solds, rank FROM ( -- 取排名前2的品牌明细 SELECT car, sum_of_solds, rank FROM car_sales WHERE rank <= 2 UNION ALL -- 汇总排名3名及以后的品牌销量 SELECT 'others' AS car, SUM(sum_of_solds) AS sum_of_solds, 'others' AS rank FROM car_sales WHERE rank > 2 ) t -- 排序保证前两名按排名顺序展示,others固定在最后 ORDER BY CASE WHEN rank = 'others' THEN 999 ELSE CAST(rank AS SIGNED) END ASC;
补充说明
你给出的期望输出示例里前两名的销量数值存在笔误,按原始表数据,排名1的tesla销量应为180000、排名2的honda销量应为150000,剩余mazda、toyota销量合计为180000,上述SQL执行后会返回符合逻辑的正确结果。
如果你的表中没有提前计算好
rank字段,可以先通过窗口函数在子查询里根据销量计算排名,再套用上述合并逻辑即可,示例排名计算逻辑:RANK() OVER(ORDER BY sum_of_solds DESC) AS rank
内容的提问来源于stack exchange,提问作者TryingToCode
相关产品推荐
相关产品推荐

