如何按订单号分组,先取每个运单号的最大成本再求和?
搞定这个需求的正确姿势
咱先把需求拆明白:第一步得先给每个运单号(TNo)找出对应的最高成本(cost),第二步再把这些最高值按订单号(OrderNo)加起来。之前的代码出错大概率是没做第一步,直接把同个TNo里的所有cost都加进去了,结果自然不对。
方法一:子查询先拿每个TNo的最大成本
这是最直白的写法,先通过子查询把每个运单号的最高成本捞出来,再基于这个结果分组求和:
SELECT OrderNo, SUM(max_cost) AS Sum FROM ( -- 先搞定每个TNo的最大cost,同时关联对应的OrderNo SELECT TNo, OrderNo, MAX(cost) AS max_cost FROM your_table_name -- 记得把这里换成你的实际表名 GROUP BY TNo, OrderNo ) AS temp_table GROUP BY OrderNo;
方法二:用窗口函数(适合新版本数据库)
如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server这些),可以用更简洁的写法,先给每一行标记它所属TNo的最大成本,再去重后求和:
SELECT OrderNo, SUM(max_cost) AS Sum FROM ( -- 用窗口函数标记每个TNo的最大成本,再去重避免重复计算 SELECT DISTINCT TNo, OrderNo, MAX(cost) OVER (PARTITION BY TNo) AS max_cost FROM your_table_name ) AS temp_table GROUP BY OrderNo;
咱来验证下结果
用你给的测试数据跑一遍:
- 子查询会先输出这样的中间结果:
TNo OrderNo max_cost 1 12 5 2 12 6 3 15 3 4 15 3 - 再按OrderNo分组求和,就正好得到你想要的:
OrderNo Sum 12 11 15 6
要是之前的错误代码是直接GROUP BY OrderNo, TNo后把cost全加了,那OrderNo12的总和会是5+4+6+3=18,肯定和期望的11对不上——这就是最容易踩的坑,别跳过第一步取最大值的操作哦!
内容的提问来源于stack exchange,提问作者Carley Guidry
相关产品推荐
相关产品推荐

