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

SQL需求:将单序列号多时间戳记录合并为单行展示

解决方法:用聚合函数+GROUP BY实现行转列

这问题我太熟了!你当前的SQL只是通过CASE语句把不同工位的时间拆成了单独的列,但因为没有做分组聚合,同一个序列号(SerialNumber)会对应多行结果——每一行只填充一个工位的时间,其他都是NULL。要把这些分散的行合并成一行,让同一个序列号的所有工位时间都显示在同一行里,只需要给每个CASE表达式套上聚合函数,再配合GROUP BY分组就行。

修改后的SQL语句

SELECT 
    tableA.SerialNumber,
    MAX(CASE WHEN tableA.SectionNumber = 4 THEN tableA.TimeComplete END) AS Station1,
    MAX(CASE WHEN tableA.SectionNumber = 5 THEN tableA.TimeComplete END) AS Station2,
    MAX(CASE WHEN tableA.SectionNumber = 2 THEN tableA.TimeComplete END) AS Station3,
    MAX(CASE WHEN tableA.SectionNumber = 6 THEN tableA.TimeComplete END) AS Station4
FROM tableA
GROUP BY tableA.SerialNumber;

关键逻辑解释

  1. 聚合函数MAX()的作用:对于同一个SerialNumber分组下的所有行,MAX()会自动忽略NULL值,只保留对应工位的有效TimeComplete值(因为每个序列号在每个工位只会有一条完成时间记录,用MAX或MIN效果一致;如果存在多条记录,MAX会取最新的时间,MIN取最早的,你可以根据需求调整)。
  2. GROUP BY SerialNumber:告诉数据库把所有相同SerialNumber的记录合并成一行,配合聚合函数完成列值的汇总。
  3. 去掉DISTINCT:分组聚合后已经自动实现了去重,不需要额外的DISTINCT关键字。

额外说明

如果你的业务需要按序列号+产线(SerialNumber + LineNumber)来分组(比如同一个序列号可能在不同产线有工位记录),只需要把LineNumber加到SELECT和GROUP BY里就行:

SELECT 
    tableA.SerialNumber,
    tableA.LineNumber,
    MAX(CASE WHEN tableA.SectionNumber = 4 THEN tableA.TimeComplete END) AS Station1,
    MAX(CASE WHEN tableA.SectionNumber = 5 THEN tableA.TimeComplete END) AS Station2,
    MAX(CASE WHEN tableA.SectionNumber = 2 THEN tableA.TimeComplete END) AS Station3,
    MAX(CASE WHEN tableA.SectionNumber = 6 THEN tableA.TimeComplete END) AS Station4
FROM tableA
GROUP BY tableA.SerialNumber, tableA.LineNumber;

内容的提问来源于stack exchange,提问作者Cheddar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:44