2016-12-27 79 views
2

我正在SQL Server 2014中工作。我有一个表,我正在尝试重新安排。我们称之为'table1'表。此表没有主键列,但有几列构成了自然键。我们称这些自然键列为'NK1','NK2'和'NK3'。该表还有几列保存标志值。标志值始终为'0'或'1'。为了简单起见,我们称这些列为'test1','test2'和'test3'。因此,表如下所示:重新安排SQL表,像一个unpivot

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'列的相应值。因此,使用上面的例子中的数据,我想重新布置的表看起来像:

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) 

有(通过SQL查询)一种有效的方式做到这一点?我说“高效”,因为我的实际table1有很多'test''列(即表格很宽),而我的实际table1有很多行(即表格很深)。 (我担心查询的易读性和执行时间。)建议我尝试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;