create function [dbo].[fn_split]( @str varchar(8000), @spliter char(1) ) returns @returnTable table (idx int primary key identity, item varchar(8000)) as begin declare @spliterIndex int select @str = @str + @spliter SELECT @str = @spliter + @str + @spliter INSERT @returnTable SELECT SUBSTRING(@str,N+1,CHARINDEX(@spliter,@str,N+1)-N-1) FROM dbo.Tally WHERE N < LEN(@str) AND SUBSTRING(@str,N,1) = @spliter ORDER BY N returnenddeclare @skills table (Resource_Id int, Skill_Id varchar(20))insert into @skillsselect 101, 'sqlserver' union allselect 101, 'vb.net' union allselect 101, 'oracle' union allselect 102, 'sqlserver' union allselect 102, 'java' union allselect 102, 'excel' union allselect 103, 'vb.net' union allselect 103, 'java' union allselect 103, 'oracle'---select * from @skills s1--- Concatenated Formatset statistics time on;SELECT Resource_Id,stuff(( SELECT ',' + Skill_Id FROM @skills s2 WHERE s2.Resource_Id= s1.resource_ID --- must match GROUP BY below ORDER BY Skill_Id FOR XML PATH('') ),1,1,'') as [Skills]FROM @skills s1GROUP BY s1.Resource_Id --- without GROUP BY multiple rows are returnedORDER BY s1.Resource_Idset statistics time off; --- CrossTab Format SELECT Resource_Id ,MAX(case when skill_id = 'Excel' then 'Yes' else '' end) as Excel ,MAX(case when skill_id = 'Java' then 'Yes' else '' end) as Java ,MAX(case when skill_id = 'Oracle' then 'Yes' else '' end) as Oracle ,MAX(case when skill_id = 'SQLServer' then 'Yes' else '' end) as SQLServer ,MAX(case when skill_id = 'VB.Net' then 'Yes' else '' end) as [VB.Net]FROM @skillsGroup by Resource_Id