如何在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返回全空是两个问题导致的:
- IN子句中写的节点名和原表的实际值不匹配,原表的节点名带空格(比如原表是
Gate Out,你写的是GateOut),完全匹配不上所以返回空 - 派生表的别名不能用
#开头,#是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
相关产品推荐
相关产品推荐

