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.