如何对ROLLUP分组的查询结果按各分组总计值排序
解决方案
你要的排序可以通过窗口函数实现,核心思路是给每个actname的所有行绑定该演出的总售票数作为全局排序权重,保证总票数低的演出整体排在最前,同个演出内部再按年份升序、总计行置后排列。
假设你原查询的完整结构如下(如果表名、聚合逻辑有差异自行替换):
SELECT actname, COALESCE(CAST(year AS VARCHAR), 'Total') AS year, SUM(tickets) AS tickets FROM 你的业务表 GROUP BY actname, ROLLUP(year)
在后面加上如下排序逻辑即可得到你要的结果:
ORDER BY -- 同个演出的所有行共用该演出的总票数做排序,总票数越低越靠前 SUM(SUM(tickets)) OVER (PARTITION BY actname) ASC, actname, -- 同个演出下先排年份数据,最后放总计行 CASE WHEN year = 'Total' THEN 1 ELSE 0 END ASC, year ASC
如果你的数据库支持NULLS LAST语法,也可以在把year转成'Total'之前排序,写法更简洁:
SELECT actname, COALESCE(CAST(year AS VARCHAR), 'Total') AS year, SUM(tickets) AS tickets FROM 你的业务表 GROUP BY actname, ROLLUP(year) ORDER BY SUM(SUM(tickets)) OVER (PARTITION BY actname) ASC, actname, year ASC NULLS LAST
内容的提问来源于stack exchange,提问作者Noah Hollowell
相关产品推荐
相关产品推荐

