I can provide you with one method though it might not be optimised one. Try this and let me know how you got on (code not tested)DECLARE @ID int,@Str varchar(2000),@Sql varchar(8000)SELECT @ID=MIN(EID)FROM GeneralWHILE @ID IS NOT NULLBEGINSELECT @Str=CAST(QUESTION AS VARCHAR(4))+ ',' AS text()FROM GeneralWHERE EID=@IDFOR XML PATH('')SELECT @Sql='SELECT * FROM (SELECT EID,DEPT,RANK,QUESTIONFROM General) gPIVOT(SUM(RANK)FOR QUESTION IN (' + LEFT(@Str,LEN(@Str)-1) + ')p'EXEC(@Sql)SELECT @ID=MIN(EID)FROM GeneralWHERE EID>@IDEND