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

如何在SQL Server中旋转日期表,合并同containerID行消除空值

方案1:修复CASE语句实现行转列

你原来的CASE写法没有加聚合和分组,所以每条原始记录都会单独生成一行,空值是其他节点不匹配CASE条件返回的。只要对每个日期列加聚合函数,再按ContainerID分组即可:

SELECT
    ContainerID,
    MAX(CASE WHEN MovementMilestone = 'Gate Out' THEN MilestoneDate END) AS mm_GateOut,
    MAX(CASE WHEN MovementMilestone = 'Yard Arrival' THEN MilestoneDate END) AS mm_YardArrival,
    MAX(CASE WHEN MovementMilestone = 'Left Yard' THEN MilestoneDate END) AS mm_LeftYard,
    MAX(CASE WHEN MovementMilestone = 'Empty Return' THEN MilestoneDate END) AS mm_EmptyReturn
FROM 
    #movementmilestone
GROUP BY ContainerID

注:用MAX/MIN都可以,同一个ContainerID下同一个节点只会有一条日期记录,聚合会自动忽略NULL值取到对应日期

方案2:修复PIVOT写法

你之前的PIVOT返回全空是两个问题导致的:

  1. IN子句中写的节点名和原表的实际值不匹配,原表的节点名带空格(比如原表是Gate Out,你写的是GateOut),完全匹配不上所以返回空
  2. 派生表的别名不能用#开头,#是SQL Server临时表的命名前缀,不能用作普通表别名

修复后的代码如下:

SELECT *
FROM
    (SELECT
         ContainerID,
         MovementMilestone,
         MilestoneDate
     FROM 
         #movementmilestone) AS source
PIVOT 
    (MAX(MilestoneDate) FOR [MovementMilestone]
     IN ([Gate Out], [Yard Arrival], [Left Yard], [Empty Return]))
    AS pivot_alias

两种方案都可以得到你要的结果:同个ContainerID合并为一行,四个节点日期分别填充到对应列,无空值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:18:00