--Start by making some test dataDECLARE @TABLE AS TABLE([RequestID] INT,[ApprovalName] VARCHAR(35))INSERT INTO @TABLE([RequestID],[ApprovalName])SELECT 15, 'Manager'UNION ALL SELECT 15, 'Director'UNION ALL SELECT 16, 'Manager'UNION ALL SELECT 16, 'Director'UNION ALL SELECT 16, 'Procurement Head'--Now to the query;WITH cte ( [RequestID], [Approval List], [ApprovalName], length ) AS (SELECT [RequestID], CAST('' AS VARCHAR(8000)), CAST('' AS VARCHAR(8000)), 0 FROM @TABLE GROUP BY [RequestID] UNION ALL SELECT p.[RequestID], CAST([Approval List] + CASE WHEN length = 0 THEN '' ELSE ', ' END + p.[ApprovalName] AS VARCHAR(8000)), CAST(p.[ApprovalName] AS VARCHAR(8000)), length + 1 FROM cte c INNER JOIN @TABLE p ON c.[RequestID] = p.[RequestID] WHERE p.[ApprovalName] > c.[ApprovalName])SELECT [RequestID], [Approval List]FROM (SELECT [RequestID], [Approval List], Rank() OVER ( PARTITION BY [RequestID] ORDER BY length DESC ) FROM cte) d ( [RequestID], [Approval List], rank )WHERE rank = 1
/*RequestID Approval List----------- -------------------------------------15 Director, Manager16 Director, Manager, Procurement Head*/
declare @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;