SQL Server按批次合并时间戳行转列问题求助
解决SQL Server中行转列并按批次合并的问题
你当前的语句只是用CASE把不同ActivityType的值放到对应列,但没有对同一BatchDescription的行进行聚合合并,所以每个ActivityType会单独占一行,其他列显示NULL。要实现每个批次一行的效果,需要结合聚合函数和GROUP BY:
SELECT BatchDescription, MAX(CASE WHEN ActivityType = 'FILE_DETECTED' THEN ActivityTime END) AS FILE_DETECTED_TIME, MAX(CASE WHEN ActivityType = 'FILE_QUEUED' THEN ActivityTime END) AS FILE_QUEUED_TIME, MAX(CASE WHEN ActivityType = 'BATCH_START' THEN ActivityTime END) AS BATCH_START_TIME, MAX(CASE WHEN ActivityType = 'BATCH_END' THEN ActivityTime END) AS BATCH_END_TIME FROM IF_FILE_PROCESSES GROUP BY BatchDescription;
说明:
- 用
MAX()(或MIN(),根据业务需求选择)包裹CASE表达式,目的是在同一BatchDescription分组下,提取出对应ActivityType的非NULL时间值(每个批次对应每个ActivityType应该只有一条记录,所以MAX/MIN结果一致)。 GROUP BY BatchDescription将所有同批次的行合并为一行,最终每个批次只会显示一条记录,各时间列对应正确的ActivityTime值。
如果你的场景中同一批次同一ActivityType可能存在多条记录,MAX()会取最晚的时间,MIN()会取最早的时间,可根据实际业务逻辑调整聚合函数。
内容的提问来源于stack exchange,提问作者Dan Goodwin
相关产品推荐
相关产品推荐

