SQL Server中如何在单查询内获取SUM的MAX与MIN值
在SQL Server中获取分组求和后的最大/最小值并同行展示
你可以通过CTE(公共表表达式)+ 子查询或者窗口函数+条件聚合的方式,在单个查询里得到分组求和后的最大、最小值及其关联的CustomCuttingOrder字段,且结果在同一行展示。
方法一:CTE + 子查询
先计算每个CustomCuttingOrder的求和值,再通过子查询分别提取最大、最小值对应的字段及数值:
WITH GroupedSums AS ( SELECT CustomCuttingOrder, SUM(YourSumColumn) AS TotalSum -- 替换成你实际需要求和的列名 FROM CustomCuttingOrder WHERE manufacturingOrder = '1368289' GROUP BY CustomCuttingOrder ) SELECT -- 获取求和值最大的CustomCuttingOrder及对应数值 (SELECT TOP 1 CustomCuttingOrder FROM GroupedSums ORDER BY TotalSum DESC) AS Max_CuttingOrder, MAX(TotalSum) AS Max_TotalSum, -- 获取求和值最小的CustomCuttingOrder及对应数值 (SELECT TOP 1 CustomCuttingOrder FROM GroupedSums ORDER BY TotalSum ASC) AS Min_CuttingOrder, MIN(TotalSum) AS Min_TotalSum FROM GroupedSums;
方法二:窗口函数 + 条件聚合
通过ROW_NUMBER()给求和值排序,再用条件聚合将最大、最小行的字段合并到同一行:
WITH GroupedSums AS ( SELECT CustomCuttingOrder, SUM(YourSumColumn) AS TotalSum, -- 按求和值降序排名,第一行就是最大值 ROW_NUMBER() OVER(ORDER BY SUM(YourSumColumn) DESC) AS Rank_Desc, -- 按求和值升序排名,第一行就是最小值 ROW_NUMBER() OVER(ORDER BY SUM(YourSumColumn) ASC) AS Rank_Asc FROM CustomCuttingOrder WHERE manufacturingOrder = '1368289' GROUP BY CustomCuttingOrder ) SELECT MAX(CASE WHEN Rank_Desc = 1 THEN CustomCuttingOrder END) AS Max_CuttingOrder, MAX(TotalSum) AS Max_TotalSum, MAX(CASE WHEN Rank_Asc = 1 THEN CustomCuttingOrder END) AS Min_CuttingOrder, MIN(TotalSum) AS Min_TotalSum FROM GroupedSums;
为什么原来的UNION方式不生效?
你之前用UNION合并两个TOP 1查询,会得到两行结果(一行最大值、一行最小值),但你的需求是把这两个结果的字段合并到同一行,所以UNION不符合场景,需要用子查询或条件聚合的方式来整合字段。
注意:记得把代码中的YourSumColumn替换成你表中实际需要求和的列名。
内容的提问来源于stack exchange,提问作者SistJortu
相关产品推荐
相关产品推荐

