2016-12-27 5 views
2

私はSQL Server 2014で作業しています。再配置しようとしているテーブルがあります。テーブル 'table1'を呼んでみましょう。この表には主キー列はありませんが、自然キーを構成する列はいくつかあります。これらの自然なキーの列を「NK1」、「NK2」、「NK3」としましょう。表には、フラグ値を保持するいくつかの列もあります。フラグ値は常に '0'または '1'です。簡単にするため、これらの列を 'test1'、 'test2'、および 'test3'とします。私は、テーブルを再配置したいアンピボットのようにSQLテーブルを再配置

CREATE TABLE table1 
(
NK1 varchar(255) 
,NK2 varchar(255) 
,NK3 varchar(255) 
,test1 int 
,test2 int 
,test3 int 
) 
; 

INSERT INTO table1 (NK1, NK2, NK3, test1, test2, test3) 
VALUES 
('a', 'x', '10', 1, 1, 0) 
,('a', 'x', '20', 1, 0, 1) 
,('b', 'x', '10', 0, 0, 1) 
; 

次のように:のようなので、テーブルに見える「テストは」「テスト」各列の名前を保持します

CREATE table table1_rearranged 
(
NK1 varchar(255) 
,NK2 varchar(255) 
,NK3 varchar(255) 
,test varchar(255) 
,flag int 
) 
; 

、 'flag'は適切な 'test'カラムの対応する値を保持します。これを行うための効率的な方法は、(SQLクエリを経由して)あり

INSERT INTO table1_rearranged (NK1, NK2, NK3, test, flag) 
VALUES 
('a', 'x', '10', 'test1', 1) 
,('a', 'x', '10', 'test2', 1) 
,('a', 'x', '10', 'test3', 0) 
,('a', 'x', '20', 'test1', 1) 
,('a', 'x', '20', 'test2', 0) 
,('a', 'x', '20', 'test3', 1) 
,('b', 'x', '10', 'test1', 0) 
,('b', 'x', '10', 'test2', 0) 
,('b', 'x', '10', 'test3', 1) 

:だから、上記の例のデータを使用して、私は再編成された表が見えるようにしたいですか?私の実際のテーブル1には多くの「テスト」カラム(テーブルが広い)があり、実際のテーブル1には多くの行(テーブルが深い)があるため「効率的」と言います。 (私はクエリと実行時間の読みやすさが気になります。)UNPIVOTを試してみることをお勧めしましたが、UNPIVOTがこれを実現するかどうかはわかりません。アンピボットを行います

答えて

1
select t.nk1, t.nk2, t.nk3 ,t.test,t.flag 
from table1 
unpivot (
    flag 
    for test in (test1, test2, test3) 
) t; 
+0

ただ、追加のテストとフラグを適用する1つの –

+0

@JohnCappelletti感謝を使用:) – GurV

0

、あるいは編集のためのクロスクエリに

select NK1, NK2, NK3, test, flag 
from table1 
cross apply (
    select 'test1' as test, test1 as flag 
    union all 
    select 'test2' as test, test2 as flag 
    union all 
    select 'test3' as test, test3 as flag 
    ) tv; 
関連する問題