【发布时间】:2016-12-28 01:24:32
【问题描述】:
我在 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 查询)?我说“高效”是因为我的实际表 1 有很多“测试”列(即表很宽),而我的实际表 1 有很多行(即表很深)。 (我担心查询的易读性和执行时间。)有人建议我尝试 UNPIVOT,但我不确定 UNPIVOT 能否实现这一目标。
【问题讨论】:
标签: sql-server