1

私はこのようなテーブルを持っています

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

誰が私が何をしているのか教えてもらえますか?

4

2 に答える 2

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
于 2012-08-03T11:57:08.283 に答える
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 つ以上の列がある場合にコードを更新する必要がないことです。

于 2012-08-03T12:45:28.923 に答える