2012-08-03 45 views
1

我有臺這樣的如何在SQL Server中使用數據透視

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 

,我想轉就喜歡:

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"  

這是我的查詢:

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      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 2012-08-03 12:00:19

+0

@Trum不客氣:-) – 2012-08-03 12:00:39

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列,則不必更新代碼。