2016-11-01 15 views
0

Wir verfolgen die Zeit und müssen die für eine bestimmte Schicht aufgewendete Zeit angeben. Die Tabelle sieht wie folgt aus und wiederholt sich für Serviceaufträge, jedoch mit unterschiedlichen Stageids.TSQL: Zeilen in Spalten umwandeln

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 

Ich muss es so drehen, dass ich eine Zeile pro Arbeitsauftrag habe, die mit staged = Travelling beginnt. wie folgt aus:

serviceorderid travel  started  completed susp 
WO-439660  5639344479 5639344574 5639345177 
WO-439660  5639345178       5639349633 
WO-439660  5639349917 5639349918    5639349920 
WO-439660  5639349921 5639349923 5639349925 

usw.

Dies hat in einer Ansicht geschrieben werden.

Eine Schicht beginnt immer mit stageId = Reisen, wenn ich alles von einer Reise zur anderen gruppieren kann, dann sollte ich in der Lage sein zu schwenken. Ich kann nicht nach Datum sortieren, da eine Schicht Tage durchqueren kann. Mit der TSQL hier zu kämpfen, wird jede Hilfe geschätzt.

+0

Können Sie Beispieldaten als Text enthalten? –

+0

ersetzt Bild mit Textdaten – Greg

Antwort

3

So etwas sollte funktionieren:

;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 
Verwandte Themen