如何将SQL ROLLUP语句生成的汇总总计行移至结果集顶部
SQL汇总行置顶实现方案
现有语句与问题
你当前使用的ROLLUP汇总SQL如下:
Select city, sum (tax) from db group by rollup (city)
默认执行返回结果中,总计行默认在末尾:
City tax A 100 B 300 Null 400
目标是将总计行移动到结果集最顶部,期望输出:
City tax Null 400 A 100 B 300
已知约束:
- 结果需要导入Excel,无法提前预知结果总行数
- 当前数据库不支持子查询写法
- 直接使用普通ORDER BY排序无法达到预期效果
可直接落地的写法
不需要子查询,只需要在原有SQL末尾增加基于grouping()函数的排序规则即可:
Select city, sum(tax) from db group by rollup(city) order by grouping(city) desc, city asc
逻辑说明
grouping(字段名)是ROLLUP语法配套的原生函数,所有支持ROLLUP的数据库都自带该函数:当行是ROLLUP生成的汇总行时,函数返回值为1;如果是普通明细行,返回值为0- 第一排序优先级用
grouping(city) desc,会直接把返回值为1的总计行排在所有结果的最顶部,不会受数据库默认Null排序规则的影响 - 第二排序优先级按
city asc写,剩下的明细行会按城市名称自然排序,如果需要调整明细行的排序规则,直接替换第二个排序条件即可,比如要按税额倒序就改成sum(tax) desc - 该写法不会误判字段本身为Null的明细数据,不需要提前统计数据行数,导出到Excel时格式完全正常
之前直接用ORDER BY排序失效的核心原因:不同数据库对Null值的默认排序规则不统一,部分数据库默认把Null值排在末尾;同时直接排序city字段无法区分「city字段本身存了Null的正常明细行」和「ROLLUP生成的汇总行」,很容易出现排序混乱。
内容的提问来源于stack exchange,提问作者Ratilius
相关产品推荐
相关产品推荐

