将两列合并为一列并添加一列

时间:2014-10-03 06:40:22

标签: sql-server sql-server-2008-r2

我想将两列合并为一列,并希望添加一列以显示两列之间的关系,如下例所示。

示例

这是员工表示例:

表:员工

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 个答案:

答案 0 :(得分:2)

您可以使用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适用于这种情况,但CROSS APPLY方法更通用,如果您需要取消更多列,或做一些稍微复杂的事情。