Sql server TSQL:将行转换为列
我们正在跟踪时间,需要报告给定班次花费的时间。表如下所示,服务订单重复,但阶段不同Sql server TSQL:将行转换为列,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我们正在跟踪时间,需要报告给定班次花费的时间。表如下所示,服务订单重复,但阶段不同 serviceorderid stageid recid datetimeexecuted WO-439660 Travelling 5639344479 2016-08-22 19:30:00.000 WO-439660 Started 5639344574 2016-08-22 20:30:00.000 WO-439660 Complete 5639345177
serviceorderid stageid recid datetimeexecuted
WO-439660 Travelling 5639344479 2016-08-22 19:30:00.000
WO-439660 Started 5639344574 2016-08-22 20:30:00.000
WO-439660 Complete 5639345177 2016-08-22 22:30:00.000
WO-439660 Travelling 5639345178 2016-08-22 22:30:00.000
WO-439660 Suspended 5639349633 2016-08-22 23:00:00.000
WO-439660 Travelling 5639349917 2016-08-24 21:00:00.000
WO-439660 Started 5639349918 2016-08-24 21:00:00.000
WO-439660 Suspended 5639349920 2016-08-24 21:45:00.000
WO-439660 Travelling 5639349921 2016-08-24 21:45:00.000
WO-439660 Started 5639349923 2016-08-24 22:15:00.000
WO-439660 Complete 5639349925 2016-08-24 22:45:00.000
WO-439660 Travelling 5639349926 2016-08-24 22:45:00.000
WO-439660 Started 5639349927 2016-08-24 23:30:00.000
WO-439660 Complete 5639349928 2016-08-24 23:30:00.000
我需要旋转它,以便每个工单有一行,以staged=Traveling开头。像这样:
serviceorderid travel started completed susp
WO-439660 5639344479 5639344574 5639345177
WO-439660 5639345178 5639349633
WO-439660 5639349917 5639349918 5639349920
WO-439660 5639349921 5639349923 5639349925
等等
这必须写在一个视图中
换班总是从stageId=旅行开始,如果我可以将所有东西从一个旅行分组到另一个旅行,那么我应该能够旋转。我不能按日期分组,因为轮班可以跨天。在这里与TSQL抗争,非常感谢您的帮助。类似的方法应该可以:
;WITH CTE AS (
SELECT serviceorderid, stageid, recid, datetimeexecuted,
COUNT(IIF(stageid='Travelling', 1, NULL))
OVER
(PARTITION BY serviceorderid
ORDER BY datetimeexecuted,
IIF(stageid = 'Started', 3,
IIF(stageid = 'Travelling', 2, 1))) AS grp
FROM mytable
)
SELECT serviceorderid,
MAX(CASE WHEN stageid='Travelling' THEN datetimeexecuted END) AS travel,
MAX(CASE WHEN stageid='Started' THEN datetimeexecuted END) AS started,
MAX(CASE WHEN stageid='Complete' THEN datetimeexecuted END) AS completed,
MAX(CASE WHEN stageid='Suspended' THEN datetimeexecuted END) AS susp
FROM CTE
GROUP BY serviceorderid, grp
像这样的方法应该会奏效:
;WITH CTE AS (
SELECT serviceorderid, stageid, recid, datetimeexecuted,
COUNT(IIF(stageid='Travelling', 1, NULL))
OVER
(PARTITION BY serviceorderid
ORDER BY datetimeexecuted,
IIF(stageid = 'Started', 3,
IIF(stageid = 'Travelling', 2, 1))) AS grp
FROM mytable
)
SELECT serviceorderid,
MAX(CASE WHEN stageid='Travelling' THEN datetimeexecuted END) AS travel,
MAX(CASE WHEN stageid='Started' THEN datetimeexecuted END) AS started,
MAX(CASE WHEN stageid='Complete' THEN datetimeexecuted END) AS completed,
MAX(CASE WHEN stageid='Suspended' THEN datetimeexecuted END) AS susp
FROM CTE
GROUP BY serviceorderid, grp
是否可以将样本数据包含为文本?将图像替换为文本数据是否可以将样本数据包含为文本?将图像替换为文本数据