2017-11-22 6 views
1

Ich habe eine Tabelle, in der eine der Spalten sagen wir col_val enthält einmal eine Beschreibung einer Aktion und einmal einen Zeitwert für diese Aktion. E.G.Entsperren Tabelle mit Werten in verschiedenen Zeilen

MachineXYZ, SerialNo 
MachineXYZ, Action1 Desc 
MachineXYZ, Action1 Time 
MachineXYZ, Action2 Desc 
MachineXYZ, Action2 Time 
... 

Ich muss das UNPIVOT so erhalten:

MachineXYZ, Action1 Desc, Action1 Time 
MachineXYZ, Action2 Desc, Action2 Time 

... 

Irgendwelche Vorschläge? Ich habe vorher nie Unpivot benutzt. Vielen Dank für Anregungen.

Antwort

0

Dies ist möglicherweise nicht genau das, was Sie suchen, da ich nicht pivot für die Antwort verwenden. Angesichts Ihres Beispiels einer Vermögenswerttabelle und einer Transaktionstabelle entschied ich mich, den Rang zu verwenden, um nur die ersten zwei Transaktionen für jede Maschine auszuwählen. Sie können die Rangfolge nach "Desc" ändern, wenn Sie die letzten beiden Aktionen möchten.

DECLARE @machine TABLE 
     (
      machineName VARCHAR(50) 
     , serialNumber VARCHAR(50) 
    ); 

INSERT INTO @machine 
    (
     machineName 
     , serialNumber 
    ) 
VALUES 
    ('ABC', '1234') 
    , ('XYZ', '4321') 
    , ('YYZ', '2112'); 

DECLARE @machineAction TABLE 
     (
      machineName VARCHAR(50) 
     , machineAction VARCHAR(50) 
     , actionTime TIME 
    ); 

INSERT INTO @machineAction 
    (
     machineName 
     , machineAction 
     , actionTime 
    ) 
VALUES 
    ('XYZ', 'Installed', '22:50:07') 
    , ('XYZ', 'Replaced', '23:44:22') 
    , ('ABC', 'Installed', '05:11:01') 
    , ('YYZ', 'Installed', '02:50:07') 
    , ('YYZ', 'Replaced', '06:44:22') 
    , ('YYZ', 'Removed', '10:33:12'); 

WITH cte_actionRank 
    AS (
      SELECT ma.machineName 
       , ma.machineAction 
       , ma.actionTime 
       , seq = RANK() OVER (PARTITION BY ma.machineName ORDER BY ma.actionTime) 
      FROM @machineAction AS ma 
     ) 
SELECT machine  = m.machineName 
    , m.serialNumber 
    , action1  = a1.machineAction 
    , action1Time = a1.actionTime 
    , action2  = a2.machineAction 
    , action2Time = a2.actionTime 
    FROM @machine      AS m 
     LEFT OUTER JOIN cte_actionRank AS a1 
      ON m.machineName = a1.machineName 
      AND a1.seq = 1 
     LEFT OUTER JOIN cte_actionRank AS a2 
      ON a1.machineName = a2.machineName 
      AND a2.seq = 2; 
Verwandte Themen