2017-11-22 18 views
1

カラムの1つがcol_valに、アクションの説明とそのアクションの時間値を一度含むテーブルがあります。 E.G.異なる行の値を持つピボットテーブル

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

私が取得するので、これをアンピボットする必要があります。

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

... 

任意の提案ですか?私は前もってピントを使わなかった。 ありがとうございます。

答えて

0

私は答えにピボットを使用していないので、これはあなたが探しているものと正確に一致しない場合があります。アセットテーブルとトランザクションテーブルの例を考えて、ランクを使用して各マシンの最初の2つのトランザクションだけを選択することにしました。最後の2つのアクションが必要な場合は、順序を変更して順序を変更できます。

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; 
関連する問題