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

如何计算Patient列总和并按DESC排序(排除总计行)

需求与SQL优化方案

需求说明

计算Paciente(患者)列的统计值,要求:

  • 按Paciente列**降序(DESC)**排序分组数据
  • 排序时排除总计行,最终将总计行放在结果末尾

原SQL查询语句

SELECT 
    C.Especialidad, COUNT(P.ClaveConsultorio) AS Paciente
FROM 
    CONSULTORIOS C 
INNER JOIN
    pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio
GROUP BY
    C.Especialidad 
 
UNION

SELECT
    'Total', COUNT(P.ClaveConsultorio) AS Paciente
FROM  
    CONSULTORIOS C 
INNER JOIN
    pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio
ORDER BY
    2 DESC

原查询存在的问题

原查询通过UNION合并分组数据与总计行后直接按Paciente降序排序,会导致总计行可能出现在结果的任意位置(比如原示例中总计行排在了第二位),不符合“总计行放在末尾”的需求。

优化后的SQL方案

方案1:用CASE表达式控制排序优先级

通过ORDER BY中的CASE表达式,让非总计行优先按Paciente降序排列,总计行固定显示在末尾:

SELECT 
    C.Especialidad, COUNT(P.ClaveConsultorio) AS Paciente
FROM 
    CONSULTORIOS C 
INNER JOIN
    pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio
GROUP BY
    C.Especialidad 
UNION ALL
SELECT
    'Total', COUNT(P.ClaveConsultorio) AS Paciente
FROM  
    CONSULTORIOS C 
INNER JOIN
    pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio
ORDER BY
    CASE WHEN Especialidad = 'Total' THEN 1 ELSE 0 END,
    Paciente DESC

提示:使用UNION ALL替代UNION,避免不必要的去重操作,提升查询效率。

方案2:用CTE拆分逻辑(更清晰)

先获取已排序的分组数据,再合并总计行,逻辑更直观:

WITH GroupedData AS (
    SELECT 
        C.Especialidad, COUNT(P.ClaveConsultorio) AS Paciente
    FROM 
        CONSULTORIOS C 
    INNER JOIN
        pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio
    GROUP BY
        C.Especialidad 
    ORDER BY
        Paciente DESC
)
SELECT * FROM GroupedData
UNION ALL
SELECT
    'Total', COUNT(P.ClaveConsultorio) AS Paciente
FROM  
    CONSULTORIOS C 
INNER JOIN
    pacientes P ON C.ClaveConsultorio = P.ClaveConsultorio

优化后效果

优化后的查询结果会先展示按患者数量降序排列的各科室数据,最后一行固定显示总计值。

内容的提问来源于stack exchange,提问作者Christian Aldana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:30:46