2014-10-03 40 views
2

我想将两列合并到一列中,并想添加一列来显示两列之间的关系,如下例所示。将两列合并为一列并添加一列额外的列

这里是雇员表例子:

表:雇员

create table employee 
(
name varchar(10), 
empid1 varchar(10), 
empid2 varchar(10) 
); 

插入一些记录:

insert into employee values('ax','A101','X101'); 
insert into employee values('by','B101','Y101'); 
insert into employee values('cz','C101','Z101'); 
insert into employee values('dw','D101','W101'); 

select * from employee; 

name empid1 empid2 
--------------------- 
abc A101 X101 
by  B101 Y101 
cz  C101 Z101 
dw  D101 W101 

:现在我想将empid1empid2合并成一个,并且想要添加一个额外的列以显示两列之间的关系,如下面所示的预期结果。

预期结果:

name IdType IdValues 
-----------------------  
abc  empid1 A101 
by  empid1 B101 
cz  empid1 C101 
dw  empid1 D101 
abc  empid2 X101 
by  empid2 Y101 
cz  empid2 Z101 
dw  empid2 W101 

回答

1

您可以使用UNPIVOT来实现这一目标:

SELECT upvt.Name, 
     upvt.IDType, 
     upvt.IDValues 
FROM Employee AS e 
     UNPIVOT 
     ( IDValues 
      FOR IDType IN ([empid1], [empid2]) 
     ) AS upvt 
ORDER BY upvt.IDType; 

Example on SQL Fiddle

另一种方法是使用CROSS APPLYTable Value Constructor

SELECT e.Name, 
     upvt.IDType, 
     upvt.IDValues 
FROM Employee AS e 
     CROSS APPLY 
     (VALUES 
      ('empid1', e.empid1), 
      ('empid2', e.empid2) 
     ) AS upvt (IDType, IDValues) 
ORDER BY upvt.IDType; 

Example on SQL Fiddle

UNPIVOT正常工作对于这种情况,但如果你需要更多的UNPIVOT列,或者做一些稍微复杂的CROSS APPLY方法是更通用。

+0

太棒了,非常感谢。 – Meem 2014-10-03 06:56:00