重新安排SQL表就像一个unpivot

时间:2016-12-27 17:05:02

标签: sql-server

我正在使用SQL Server 2014.我有一个表,我正在尝试重新安排。我们称之为'table1'。此表没有主键列,但有一些列包含自然键。我们将这些自然键列称为“NK1”,“NK2”和“NK3”。该表还有几个包含标志值的列。标志值始终为“0”或“1”。为简单起见,我们将这些列称为“test1”,“test2”和“test3”。因此,该表看起来像:

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
)
;

其中'test'将包含每个'test'列的名称,'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是否会实现这一点。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

Unpivot会这样做,或者使用交叉申请

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;