Fusionner deux colonnes en une et append une colonne supplémentaire

Je souhaite merge deux colonnes en une colonne et je souhaite append une colonne supplémentaire pour afficher la relation entre deux colonnes, comme indiqué ci-dessous dans l'exemple.

Exemple

Voici l'exemple de la table des employés:

Tableau: Employé

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

Insérer des loggings:

  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 

Note : Maintenant, je veux merge empid1 et empid2 en un seul et aussi vouloir append une colonne supplémentaire pour montrer la relation entre deux colonnes comme indiqué ci-dessous dans le résultat attendu.

Résultat attendu:

 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 

Vous pouvez utiliser UNPIVOT pour y parvenir:

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

Exemple sur SQL Fiddle

Une alternative consiste à utiliser CROSS APPLY avec un constructor de valeur de table :

 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; 

Exemple sur SQL Fiddle

UNPIVOT fonctionne UNPIVOT pour ce scénario, mais l'approche CROSS APPLY est plus polyvalente si vous avez besoin de déplier davantage de colonnes ou de faire quelque chose d'un peu plus complexe.