Hi @harinathu ,
Please try the following solutions.
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (sid int NULL, course varchar(500) NULL, name varchar(50) NULL);
INSERT INTO @tbl (sid, course, name) VALUES
(1, N'database-sql;FE-Java', N'abc'),
(2, N'FE-net;database-oracle;FE-python', N'xyz'),
(3, N'test', N'axy'),
(4, N'FE-python-java;base-mysql', N'anr');
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = ';'
, @comma CHAR(1) = ','
, @dash CHAR(1) = '-';
-- Method #1
-- SQL Server 2016 onwards
SELECT tbl.*
, REPLACE(STUFF((SELECT @comma + IIF(pos=0,'',SUBSTRING(value, pos + 1, LEN(value)))
FROM @tbl AS tbl_inner
CROSS APPLY STRING_SPLIT(tbl_inner.course, @separator) AS ss
CROSS APPLY (SELECT CHARINDEX(@dash, value)) AS t(pos)
WHERE tbl_inner.sid = tbl.sid
FOR XML PATH('')), 1, 1, ''),@dash,@comma) AS Result
FROM @tbl AS tbl;
-- Method #2
-- SQL Server 2012 onwards
;WITH rs AS
(
SELECT s.*,
-- get all tokens starting from the 2nd
ISNULL(v.query('data(i[position() ge 2])').value('.', 'varchar(100)'), '') AS [splitted]
FROM @tbl AS s
CROSS APPLY (SELECT TRY_CAST('<v><i>' +
REPLACE(REPLACE(course, @separator, '</i></v><v><i>'), @dash, '</i><i>') +
'</i></v>' AS XML)) AS t(xml_data)
CROSS APPLY xml_data.nodes('/v') AS n(v)
)
SELECT sID, course, name
, STUFF((SELECT @comma + REPLACE(splitted,SPACE(1),@comma)
FROM rs
where t.sID = rs.sID FOR XML PATH('')),1,1,'') AS Course
FROM @tbl AS t
GROUP BY SID, course, name;
Output
+-----+----------------------------------+------+-------------------+
| sID | course | name | Course |
+-----+----------------------------------+------+-------------------+
| 1 | database-sql;FE-Java | abc | sql,Java |
| 2 | FE-net;database-oracle;FE-python | xyz | net,oracle,python |
| 3 | test | axy | |
| 4 | FE-python-java;base-mysql | anr | python,java,mysql |
+-----+----------------------------------+------+-------------------+