SQL查询:如何让ROLLUP生成的Total行留末尾且其他行降序?
解决方案:让ROLLUP总计行始终排在结果末尾
没问题,这个需求非常常见——咱们只需要调整ORDER BY子句的逻辑,就能在保持普通行按数量降序的同时,把总计行(Total)固定在结果最后。
问题根源
你原来的ORDER BY 2 DESC会直接按Nombre de tickets降序排序,而Total行的计数是所有行的总和,自然会排在最前面。咱们需要给Total行一个特殊的排序优先级,让它“靠后站”。
方案1:通过字符串判断调整排序(简单直接)
修改后的SQL如下:
SELECT ISNULL([SharepointId], 'Total') AS 'Sharepoint', COUNT([Id]) AS 'Nombre de tickets' FROM [dbo].[Tickets] GROUP BY ROLLUP([SharepointId]) ORDER BY -- 给Total行标记为1,其他行标记为0,0排在1前面 CASE WHEN Sharepoint = 'Total' THEN 1 ELSE 0 END, -- 普通行按数量降序排列 [Nombre de tickets] DESC, -- 可选:数量相同时按Sharepoint名称排序,保证结果稳定 Sharepoint
执行后你会得到这样的结果:
| Nombre de tickets |
|---|
| 9396 |
| 1503 |
| ... |
| 20326 |
方案2:用GROUPING()函数更严谨(推荐)
如果你的SharepointId字段本身可能存在'Total'这个值(虽然概率低,但要避免冲突),可以用SQL Server的GROUPING()函数来识别ROLLUP生成的总计行,这个方法更可靠:
SELECT ISNULL([SharepointId], 'Total') AS 'Sharepoint', COUNT([Id]) AS 'Nombre de tickets' FROM [dbo].[Tickets] GROUP BY ROLLUP([SharepointId]) ORDER BY -- GROUPING返回1表示是总计行,0是普通行,所以普通行优先 GROUPING([SharepointId]), [Nombre de tickets] DESC, Sharepoint
GROUPING()函数的作用是:当某行是ROLLUP/CUBE生成的聚合行时,对应分组字段的GROUPING()返回1,否则返回0。用它来判断总计行,完全不会和业务数据冲突。
内容的提问来源于stack exchange,提问作者user5441558
相关产品推荐
相关产品推荐

