tech, here is my attempt to understand what you are trying to do and to produce a solution. I may be off-target - if I am, modify the script to create the correct set of input data and then also include what you want the output data to look like. Then, post the whole query back - that will make it easier for someone to copy it to their computer and run it.--- CREATE TEST TABLEcreate table #Tracks ( Artist varchar(100), TrackName varchar(100), genre varchar(100), Stage varchar(100));-- INSERT DATA INTO TEST TABLEinsert into #Tracks values ('Elton John','Candle in the Wind','slow','intro');insert into #Tracks values ('Elton John','Candle in the Wind','slow','middle');insert into #Tracks values ('Elton John','Candle in the Wind','slow','outro');insert into #Tracks values ('Lady Gaga','Telphone','pop','afterparty');insert into #Tracks values ('Beyonce','Single Ladies','r''n''b','middle');--- QUERY TO GET RESULTSselect a.Artist, a.TrackName, max(a.genre) AGenre, b.Stagesfrom #Tracks a cross apply ( select stuff(( select distinct ','+b.Stage as [text()] from #Tracks b where b.Artist = a.Artist and b.TrackName = a.TrackName order by ','+b.Stage for xml path(''),type ).value('.','varchar(max)'),1,1,'') Stages ) bgroup by a.Artist, a.TrackName, b.Stages;-- CLEANUPdrop table #Tracks;