You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:57:39