2016-11-01 9 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で始まる作業オーダーごとに1つの行があるようにピボットする必要があります。このように:

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から始まります.1つの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