如何计算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
相关产品推荐
相关产品推荐

