Please try the following (it is as pretty as the data structure) - optimized with UNPIVOT
:
set nocount on
declare @source table (Department varchar(50), SaleMngrs varchar(50), Operators varchar(50), Secretary varchar(50));
insert into @source values ('Technics' , '123,456,77', '+122,Line 1' , '77889,112');
insert into @source values ('Development', '123,3366' , null , 'Lines 7-8');
;WITH cte (Department, TypeOfContact, Contact)
AS
(
SELECT Department, TypeOfContact, cast('<Contact><c>' + replace(Contact,',','</c><c>') + '</c></Contact>' as xml) AS Contact
FROM (SELECT Department, SaleMngrs AS SalesManagers, Operators, Secretary FROM @source) p
UNPIVOT (Contact FOR TypeOfContact IN (SalesManagers, Operators, Secretary)) AS unpvt
)
Select Department
, TypeOfContact
, Contact.c.value('.','varchar(20)') AS Contact
, ROW_NUMBER() OVER (PARTITION BY Department, TypeOfContact ORDER BY Department, TypeOfContact) AS ContactOrder
FROM cte CROSS APPLY Contact.nodes('/Contact/c') as Contact(c);
OUTPUT
Department TypeOfContact Contact ContactOrder
------------ ------------- -------------------- --------------------
Development SalesManagers 123 1
Development SalesManagers 3366 2
Development Secretary Lines 7-8 1
Technics Operators +122 1
Technics Operators Line 1 2
Technics SalesManagers 123 1
Technics SalesManagers 456 2
Technics SalesManagers 77 3
Technics Secretary 112 1
Technics Secretary 77889 2
EDIT: Optimized query using UNPIVOT (original below):
set nocount on
declare @source table (Department varchar(50), SaleMngrs varchar(50), Operators varchar(50), Secretary varchar(50));
insert into @source values ('Technics' , '123,456,77', '+122,Line 1' , '77889,112');
insert into @source values ('Development', '123,3366' , null , 'Lines 7-8');
;WITH cte (Department, SalesMngrs, Operators, Secretary)
AS
(
select Department
, cast('<SaleMngrs><c>' + replace(SaleMngrs,',','</c><c>') + '</c></SaleMngrs>' as xml) AS SalesMngrs
, cast('<Operators><c>' + replace(Operators,',','</c><c>') + '</c></Operators>' as xml) AS Operators
, cast('<Secretary><c>' + replace(Secretary,',','</c><c>') + '</c></Secretary>' as xml) AS Secretary
from @source
)
Select Department
, TypeOfContact
, Contact
, ROW_NUMBER() OVER (PARTITION BY Department, TypeOfContact ORDER BY Department, TypeOfContact) AS ContactOrder
FROM (
Select Department, 'SalesManagers' AS TypeOfContact, SaleMngrs.c.value('.','varchar(20)') as Contact
from cte CROSS APPLY SalesMngrs.nodes('/SaleMngrs/c') as SaleMngrs(c)
union
Select Department, 'Operators', Operators.c.value('.','varchar(20)')
from cte CROSS APPLY Operators.nodes('/Operators/c') as Operators(c)
union
Select Department, 'Secretary', Secretary.c.value('.','varchar(20)')
from cte CROSS APPLY Secretary.nodes('/Secretary/c') as Secretary(c)
) AS q;