2

次の形式でテーブルにデータを保存しています

BatchID              EntityChanged             ChangeValue

EERS                  ABC                       DEF
EERS                  ABCD                      XYZ
EERS                  Something                 SomeValue
New Batch             SomethingMore             GHI

「EntityChanged」列に表示できる値のリストは有限であり、事前にわかっており、スペースなどは含まれていません。議論のために、このリストは-ABC、ABCD、Something、SomethingMoreであるとしましょう。

次に、上記のデータセットについて、次の出力が必要です。

BatchID            ABC              ABCD            Something       SomethingMore
EERS               DEF              XYZ             SomeValue       NULL   
New Batch          NULL             NULL            NULL            GHI

Pivotを使用すると、これまでしか行けませんでした。

誰かがこのデータを希望の方法でスライスするのを手伝ってくれませんか?

4

2 に答える 2

3

これには、静的PIVOTまたは動的PIVOTのいずれかを介して、PIVOTを使用できます。これは、列の数が不明な場合に適しています。

静的(デモ付きのSQLフィドルを参照):

create table t2
(
    batchid varchar(10),
    entitychanged varchar(20),
    changevalue varchar(10)
)

insert into t2 values ('EERS', 'ABC', 'DEF')
insert into t2 values ('EERS', 'ABCD', 'XYZ')
insert into t2 values ('EERS', 'Something', 'SomeValue')
insert into t2 values ('New Batch', 'SomethingMore', 'GHI')

select *
from 
(
    select batchid, entitychanged, changevalue
    from t2
) x
pivot
(
    min(changevalue)
    for entitychanged in ([ABC], [ABCD], [Something], [SomethingMore])
) p

動的(デモを使用したSQLフィドルを参照):

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

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

set @query = 'SELECT batchid, ' + @cols + ' from 
             (
                 select batchid, entitychanged, changevalue
                 FROM   t2
            ) x
            pivot 
            (
                min(changevalue)
                for entitychanged in (' + @cols + ')
            ) p '

execute(@query)

どちらも同じ結果になります。

于 2012-06-20T14:51:38.707 に答える
1

これを試して:

SELECT BatchID, 
   MAX(CASE WHEN EntityChanged = 'ABC' THEN ChangeValue END) 'ABC',
   MAX(CASE WHEN EntityChanged = 'ABCD' THEN ChangeValue END) 'ABCD',
   MAX(CASE WHEN EntityChanged = 'Something' THEN ChangeValue END) 'Something',
   MAX(CASE WHEN EntityChanged = 'SomethingMore' THEN ChangeValue END) 'SomethingMore'
FROM YourTable t 
GROUP BY BatchID

デモ

于 2012-06-20T14:38:09.420 に答える