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

如何使用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;

特定数据库简化写法

  1. 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;
  1. 支持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:54:03