2016-11-01 2 views
0

우리는 시간을 추적하고 주어진 근무 시간 동안보고 한 시간을보고해야합니다. 테이블은 아래처럼 보이며 서비스 주문에 대해 반복되지만 스테이지는 다양합니다.TSQL : 행을 열로 덮음

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 = Traveling에서 시작됩니다. 여행 중 하나에서 다른 그룹으로 모든 것을 그룹화 할 수 있으면 피벗 할 수 있어야합니다. 나는 교대가 일을 교차 할 수 있기 때문에 날짜별로 그룹화 할 수 없다. 여기 TSQL로 고군분투, 어떤 도움을 주셔서 감사합니다. 이 같은

+0

당신이 텍스트로 샘플 데이터를 포함 할 수 있습니다? –

+0

대체 된 이미지와 텍스트 데이터 – Greg

답변

3

뭔가 작업을해야합니다 :

;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