如何使用SQL合并相同OrderNumber的多行数据并汇总时间信息
实现思路
这个需求属于典型的行转列场景,只需按OrderNumber分组,通过条件聚合将不同步骤对应的时间映射到指定列即可。
各数据库通用写法(兼容MySQL、PostgreSQL、SQL Server、Oracle等绝大多数数据库)
SELECT OrderNumber, MAX(CASE WHEN Step = '下单' THEN StepTime ELSE NULL END) AS 下单时间, MAX(CASE WHEN Step = '支付' THEN StepTime ELSE NULL END) AS 支付时间, MAX(CASE WHEN Step = '出库' THEN StepTime ELSE NULL END) AS 出库时间, MAX(CASE WHEN Step = '签收' THEN StepTime ELSE NULL END) AS 签收时间 FROM 你的业务表名 GROUP BY OrderNumber ORDER BY OrderNumber;
特定数据库简化写法
- MySQL 可使用IF函数简化判断逻辑
SELECT OrderNumber, MAX(IF(Step = '下单', StepTime, NULL)) AS 下单时间, MAX(IF(Step = '支付', StepTime, NULL)) AS 支付时间, MAX(IF(Step = '出库', StepTime, NULL)) AS 出库时间, MAX(IF(Step = '签收', StepTime, NULL)) AS 签收时间 FROM 你的业务表名 GROUP BY OrderNumber ORDER BY OrderNumber;
- 支持PIVOT语法的数据库(SQL Server、PostgreSQL等)可直接用行转列语法实现,以下为SQL Server示例:
SELECT * FROM ( SELECT OrderNumber, Step, StepTime FROM 你的业务表名 ) AS 源数据 PIVOT ( MAX(StepTime) FOR Step IN ([下单], [支付], [出库], [签收]) ) AS 透视结果 ORDER BY OrderNumber;
注意事项
- 上述代码中使用
MAX聚合是因为每个订单的每个步骤默认仅有一条时间记录,替换为MIN也可达到相同效果 - 你需要根据自己表中实际的步骤名称调整判断条件和输出的列名
- 如果存在订单缺失某步骤的情况,对应列会返回NULL,可通过
COALESCE(聚合结果, '默认值')替换为你需要的填充值
内容的提问来源于stack exchange,提问作者bue123
相关产品推荐
相关产品推荐

