2017-11-22 1 views
1

열 중 하나가 col_val에 한 번 설명을 포함하고 한 번 해당 동작에 대한 시간 값이 포함 된 테이블이 있습니다. E.G.다른 행에 값이있는 피벗 테이블

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

... 

어떤 제안 :

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

내가 얻을 수 있도록이 피벗 해제해야합니까? 전에 피벗을 사용하지 않았어. 제안 해 주셔서 감사합니다.

답변

0

답변을 위해 unpivot을 사용하지 않았으므로 정확히 찾고있는 내용이 아닐 수도 있습니다. 귀하의 자산 테이블과 거래 테이블의 예를 생각해 볼 때 순위를 사용하여 각 기계에 대한 처음 두 트랜잭션 만 선택하기로 결정했습니다. 마지막 두 가지 작업을 원할 경우 순서대로 순위를 변경할 수 있습니다.

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; 
관련 문제