2014-10-03 4 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 

Примечание: Теперь я хочу объединить empid1 и empid2 в один, а также добавить один дополнительный столбец, чтобы показать связь между двумя столбцами, как показано ниже в ожидаемом результате.

Ожидаемый результат:

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 APPLY с Table 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 подход является более универсальным, если вам нужно UNPIVOT больше столбцов, или сделать что-то немного более сложным.

+0

Удивительно, большое вам спасибо. – Meem