;WITH CTE AS ( SELECT ID,[Desc], LEFT(PARSENAME(REPLACE([Desc],' ', '.'), 3),1) AS String1, LEFT(PARSENAME(REPLACE([Desc],' ', '.'), 2),1) AS String2, LEFT(PARSENAME(REPLACE([Desc],' ', '.'), 1),3) AS String3, ROW_NUMBER()OVER(PARTITION BY LEFT(PARSENAME(REPLACE([Desc],' ', '.'), 1),3) ORDER BY ID) AS RNum1 FROM @tmpV ) SELECT ID,[Desc],CONCAT(String1,String2,String3) AS DescID FROM CTE WHERE RNum1 = 1 UNION SELECT ID,[Desc], CONCAT(String1,String2,CASE WHEN ROW_NUMBER()OVER(PARTITION BY LEFT(String3,2) ORDER BY ID) BETWEEN 1 AND 10 THEN LEFT(String3,2)+ CAST(ROW_NUMBER()OVER(PARTITION BY LEFT(String3,2) ORDER BY ID) AS VARCHAR(10)) WHEN ROW_NUMBER()OVER(PARTITION BY LEFT(String3,2) ORDER BY ID) BETWEEN 11 AND 100 THEN LEFT(String3,1)+CAST(ROW_NUMBER()OVER(PARTITION BY LEFT(String3,2) ORDER BY ID) AS VARCHAR(10)) END ) AS DescID FROM CTE WHERE RNum1 > 1