Вам просто нужно несколько объединений для получения базовых данных и динамический c pivot
для отображения результата в нужном формате.
попробуйте следующее:
drop table if exists #temp
--base table with all details
select s.ID SurveyID, s.SubmittedBy, sq.Question, sa.Answer
into #temp
from @Survey s
join @SurveyMaster sm on sm.ID = s.SurveyMasterID
join @SurveyQuestion sq on sq.SurveyMasterID = s.SurveyMasterID
join @SurveyAnswers sa on sa.SurveyQuestionID = sq.ID and sa.SurveyID = s.ID
--dynamic pivot
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Question)
FROM #temp c
ORDER BY 1 DESC
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT SurveyID, SubmittedBy, ' + @cols + ' from
(
select SurveyID, SubmittedBy, Question, Answer
from #temp
) x
pivot
(
max(Answer)
for Question in (' + @cols + ')
) p '
--execution
execute(@query)
Пожалуйста, найдите дб <> скрипка здесь .