2012-08-03 6 views
1

는이 같은 테이블SQL 서버에서 피벗을 사용하는 방법

ID      TimeStamp     Statement         Action 
8082837636688904709  2012-07-23 16:03:25.000  UPDATE Skill name="French" SET state="1" 1 
8082837636688904709  2012-07-23 16:03:25.000  UPDATE Skill name="French" SET state="2" 2 

이 있고 내가 좋아하는 조옮김 할 :

SELECT ID, Timestamp, [UndoStatement], [RedoStatement] 
FROM (
SELECT ID, TimeStamp, Statement, Action From Transactions) a 

PIVOT 
(
    MAX(Statement) FOR Statement IN ([UndoStatement], [RedoStatement]) 
) as pvt 

과 :

ID      TimeStamp     UndoStatement         RedoStatement 
8082837636688904709  2012-07-23 16:03:25.000  UPDATE Skill name="French" SET state="1"  UPDATE Skill name="French" SET state="2"  

이 내 쿼리입니다 이것이 내가 얻은 것입니다.

ID      UndoStatement RedoStatement 
8082837636688904709  NULL   NULL 
8082837636688904709  NULL   NULL 

아무도 내가하고있는 일을 말할 수 있습니까?

답변

2

제대로 표시되면 동작 - 1이 실행 취소되고 2가 다시 실행됨을 나타냅니다.

SELECT ID, Timestamp, [1] [UndoStatement], [2] [RedoStatement] 
FROM (
SELECT ID, TimeStamp, Statement, Action From Transactions) a 
PIVOT 
(
    MAX(Statement) FOR Action IN ([1], [2]) 
) as pvt 
+1

예프가 완벽하게 작동합니다. 감사. – Trum

+0

@Trum 환영합니다 :-) –

1

필요 알 수 있습니다 당신이 몇 가지 항목이 당신이 PIVOT을 동적으로 할 수있는 다음 전치 될 경우.

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Action) 
        from Transactions 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT ID, Timestamp, ' + @cols + ' from 
      (
       select ID, TimeStamp, Statement, Action 
       from Transactions 
      ) x 
      pivot 
      (
       MAX(Statement) 
       for Action in (' + @cols + ') 
      ) p ' 

execute(@query) 

이 코드는 런타임에 변환 할 열을 결정합니다. 이점은 2 열 이상인 경우 코드를 업데이트 할 필요가 없다는 것입니다.

관련 문제