重新排列SQL表

skyline01

我正在使用SQL Server2014。我有一个要重新排列的表。让我们将表称为“ 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
)
;

其中“测试”将保存每个“测试”列的名称,而“标志”将保存相应的“测试”列中的相应值。因此,使用上面的示例数据,我希望重新排列的表看起来像:

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有很多“测试”列(即表很宽),而我的实际table1有很多行(即表很深)。(我担心查询的可读性和执行时间。)建议我尝试使用UNPIVOT,但是我不确定UNPIVOT是什么可以实现此目的。

古尔温德·辛格
select t.nk1, t.nk2, t.nk3 ,t.test,t.flag
from table1
unpivot (
  flag
  for test in (test1, test2, test3)
) t;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章