You need to use Recursive CTE
;WITH DATA
AS (SELECT *
FROM (VALUES ('ALI','ABU'),
('JOSH','LIM'),
('JAMES','KAREN'),
('LIM','JERRY'),
('JERRY','GEM')) TC(EMP_ID, EMP_L1)),
REC_CTE
AS (SELECT EMP_ID,
EMP_L1,
Cast(EMP_L1 AS VARCHAR(8000)) AS PARENT,
LEVEL = 1
FROM DATA
UNION ALL
SELECT D.EMP_ID,
D.EMP_L1,
Cast(RC.PARENT + '.' + D.EMP_L1 AS VARCHAR(8000)),
LEVEL = LEVEL + 1
FROM DATA D
JOIN REC_CTE RC
ON RC.EMP_ID = D.EMP_L1)
SELECT TOP 1 WITH TIES EMP_ID,
EMP_L1 = COALESCE(Parsename(PARENT, 1), ''),
EMP_L2 = COALESCE(Parsename(PARENT, 2), ''),
EMP_L3 = COALESCE(Parsename(PARENT, 3), ''),
EMP_L4 = COALESCE(Parsename(PARENT, 4), '')
FROM REC_CTE
ORDER BY Row_number()OVER(PARTITION BY EMP_ID ORDER BY LEVEL DESC)
OPTION (MAXRECURSION 0)
Result:
╔════════╦════════╦════════╦════════╦════════╗
║ EMP_ID ║ EMP_L1 ║ EMP_L2 ║ EMP_L3 ║ EMP_L4 ║
╠════════╬════════╬════════╬════════╬════════╣
║ ALI ║ ABU ║ ║ ║ ║
║ JAMES ║ KAREN ║ ║ ║ ║
║ JERRY ║ GEM ║ ║ ║ ║
║ JOSH ║ LIM ║ JERRY ║ GEM ║ ║
║ LIM ║ JERRY ║ GEM ║ ║ ║
╚════════╩════════╩════════╩════════╩════════╝
Note: In this case, there can be no more than 4 levels. To split the data into different columns, I used a function PARSENAMEthat will not work if you have more than 4 levels.
If you do not want to split the parents into different columns, delete PARSENAMEand select only the column PARENT.