spLoadRecord_SiteSurveys
Parameters
Parameter | Parameter Type | Mode | Description |
---|---|---|---|
@PKID | int | IN | |
@LoadResponseSummary | bit | IN |
Definition
Copy
CREATE procedure [dbo].[spLoadRecord_SiteSurveys]
(
@PKID int,
@LoadResponseSummary bit = 0
)
as
begin
set nocount on;
declare @QTypeMatrixDD integer;
declare @hasResults bit;
declare @count integer;
declare @numSurveyResponses integer;
declare @questions table(
id integer,
TotalRespondents integer,
Skipped integer
);
declare @responseSummary table(
QId integer,
QSeq integer,
AId integer,
ASeq integer,
AColId integer,
AColSeq integer,
AnswerValue nvarchar(max), -- AnswerValue resized from nvarchar(256) to varchar(max)
ResponsePercent integer,
ResponseTotal integer
);
declare @matrixRows table(
QId integer,
AId integer
);
declare @matrixCols table(
QId integer,
AColId integer
);
select @numSurveyResponses = count(*)
from SiteSurveyResponses
where SiteSurveysId = @PKID;
set @hasResults = 0;
set @QTypeMatrixDD = 8; -- Question Type Matrix Multiple Answers Drop Downs
select @count = count(*)
from SiteSurveyResults a
inner join SiteSurveyAnswers b on a.SiteSurveyAnswersId = b.id
inner join SiteSurveyQuestions c on b.SiteSurveyQuestionsId = c.Id
where c.SiteSurveysId = @PKID;
-- if the survey is closed ignore the flag
if exists (select * from SiteSurveys where ID = @PKID and State = 2)
set @LoadResponseSummary = 1;
if (@LoadResponseSummary = 1)
begin
insert into @responseSummary(QId, AId)
select a.SiteSurveyQuestionsId, a.ID
from SiteSurveyAnswers a
inner join SiteSurveyQuestions b on a.SiteSurveyQuestionsId = b.id
where b.SiteSurveysId = @PKID;
insert into @matrixCols(QId, AColId)
select b.ID, a.ID
from SiteSurveyAnswerColumns a
inner join SiteSurveyQuestions b on b.Id = a.SiteSurveyQuestionsId
where b.SiteSurveysId = @PKID;
insert into @matrixRows(QId, AId)
select c.Qid, a.Id
from SiteSurveyAnswers a
inner join (select distinct QId from @matrixCols) c
on c.Qid = a.SiteSurveyQuestionsId;
delete @responseSummary
from @responseSummary a
inner join @matrixRows b
on a.AId = b.AId;
insert into @responseSummary(QId, AId, AColId)
select a.QId, a.AId, b.AColId
from @matrixRows a
cross join @matrixCols b
where a.QId = b.QId;
update @responseSummary
set AColId = 0 where AColId is null;
update @responseSummary
set ResponseTotal = v.ResponseTotal
from @responseSummary a inner join
(
select a.SiteSurveyAnswersId, a.SiteSurveyAnswerColumnsId, count(*) 'ResponseTotal'
from SiteSurveyResults a
inner join SiteSurveyAnswers b on a.SiteSurveyAnswersId = b.id
inner join SiteSurveyQuestions c on b.SiteSurveyQuestionsId = c.Id
where c.SiteSurveysId = @PKID
and c.SiteSurveyQuestionTypesId != @QTypeMatrixDD
group by SiteSurveyAnswersId, SiteSurveyAnswerColumnsId
) as v
on a.AId = v.SiteSurveyAnswersId
and a.AColId = v.SiteSurveyAnswerColumnsId;
update @responseSummary
set AnswerValue = b.AnswerValue
from @responseSummary a
inner join SiteSurveyResults b on a.AId = b.SiteSurveyAnswersId
and a.AColId = b.SiteSurveyAnswerColumnsId;
-- Special case for Matrix - Multiple Answers (Dropdown)
if exists(select c.ID
from SiteSurveyQuestions c
where c.SiteSurveyQuestionTypesId = @QTypeMatrixDD and c.SiteSurveysID = @PKID)
begin -- special case
delete from @matrixCols;
delete from @matrixRows;
insert into @matrixRows(QId, AId)
select distinct a.SiteSurveyQuestionsId, a.Id
from SiteSurveyAnswers a
inner join SiteSurveyAnswerColumns b on b.SiteSurveyQuestionsId = a.SiteSurveyQuestionsId
inner join SiteSurveyQuestions c on b.SiteSurveyQuestionsId = c.ID
where c.SiteSurveyQuestionTypesId = @QTypeMatrixDD;
insert into @matrixCols(QId, AColId)
select b.SiteSurveyQuestionsId, a.ID
from SiteSurveyAnswerColumnData a
inner join SiteSurveyAnswerColumns b on a.SiteSurveyAnswerColumnsId = b.ID;
delete @responseSummary
from @responseSummary a
inner join SiteSurveyQuestions b on b.ID = a.QId
and b.SiteSurveyQuestionTypesId = @QTypeMatrixDD;
insert into @responseSummary(QId, AId, AnswerValue)
select a.QId, a.AId, cast(b.AColId as nvarchar(256))
from @matrixRows a
cross join @matrixCols b
where a.QId = b.QId;
update @responseSummary
set AColId = a.SiteSurveyAnswerColumnsId
from SiteSurveyAnswerColumnData a
inner join @responseSummary b on b.AnswerValue = cast(a.ID as nvarchar(50))
inner join SiteSurveyQuestions c on c.ID = b.QId
where c.SiteSurveyQuestionTypesId = @QTypeMatrixDD;
update @responseSummary
set AColSeq = c.Sequence
from @responseSummary a
inner join SiteSurveyQuestions b on b.ID = a.QId and b.SiteSurveyQuestionTypesId = @QTypeMatrixDD
inner join SiteSurveyAnswerColumndata c on c.SiteSurveyAnswerColumnsID = a.AColId and cast(a.AnswerValue as int) = c.ID;
update @responseSummary
set ResponseTotal = v.ResponseTotal
from @responseSummary a inner join
(
select a.SiteSurveyAnswersId, a.SiteSurveyAnswerColumnsId, a.AnswerValue, count(*) 'ResponseTotal'
from SiteSurveyResults a
inner join SiteSurveyAnswers b on a.SiteSurveyAnswersId = b.id
inner join SiteSurveyQuestions c on b.SiteSurveyQuestionsId = c.Id
where c.SiteSurveysId = @PKID
and c.SiteSurveyQuestionTypesId = @QTypeMatrixDD
group by SiteSurveyAnswersId, SiteSurveyAnswerColumnsId, AnswerValue
) as v
on a.AId = v.SiteSurveyAnswersId
and a.AColId = v.SiteSurveyAnswerColumnsId
and a.AnswerValue = v.AnswerValue
collate database_default;
end -- special case
update @responseSummary
set QSeq = b.Sequence
from @responseSummary a
inner join SiteSurveyQuestions b on b.ID = a.QId;
update @responseSummary
set ASeq = b.Sequence
from @responseSummary a
inner join SiteSurveyAnswers b on b.ID = a.AId;
insert into @questions(id, TotalRespondents)
select id, count(*) from
(select distinct a.SiteSurveyResponsesId, c.id
from SiteSurveyResults a
inner join SiteSurveyAnswers b on a.SiteSurveyAnswersId = b.id
inner join SiteSurveyQuestions c on b.SiteSurveyQuestionsid = c.id
where c.SiteSurveysId = @PKID) as v
group by id;
insert into @questions(id, TotalRespondents)
select id, 0 from SiteSurveyQuestions
where SiteSurveysId = @PKID
and id not in (select id from @questions);
update @questions set Skipped = (@numSurveyResponses - TotalRespondents);
update @responseSummary
--set ResponsePercent = ((b.ResponseTotal * 100)/@numSurveyResponses),
set ResponsePercent = ROUND((convert(decimal(30,10),b.ResponseTotal)/convert(decimal(30,10),@numSurveyResponses)) * 100.0, 0)
from @questions a
inner join @responseSummary b on a.ID = b.QId;
end
-- result set #1
select ID, ClientSitesID, Title, TitleVisible, SubTitle, SubTitleVisible,
LastActivityDate, SubmitButtonText, NextButtonText, PrevButtonText, PrevButtonVisible,
ExitButtonText, ExitButtonVisible, AllowMultipleSubmit, OnSubmitMsg, AllowViewResults,
State, ClosedMsg, @hasResults 'HasResults', @numSurveyResponses 'TotalResponses'
from SiteSurveys where ID = @PKID;
-- result set #2
select ssq.ID, ssq.SiteSurveysId, ssq.SiteSurveyQuestionTypesId, ssq.Sequence, ssq.Page,
ssq.LinkText, ssq.Question, ssq.SubTitle, ssq.RandomizeAnswers, ssq.Mandatory, ssq.MaxAnswerLen,
ssq.LastActivityDate, ssq.ConstantSumValue, ssq.SkipAutoNbr,
q.id, q.TotalRespondents, q.Skipped
from SiteSurveyQuestions ssq left outer join @questions q on q.id = ssq.id
inner join SiteSurveys ss on ss.id = ssq.SiteSurveysId
where ss.ID = @PKID
order by ssq.Sequence;
-- result set #3
select ssa.ID, ssa.SiteSurveyQuestionsId, ssa.Sequence, ssa.Answer, ssa.NextQuestionId
from SiteSurveyAnswers ssa inner join SiteSurveyQuestions ssq on ssq.ID = ssa.SiteSurveyQuestionsId
where ssq.SiteSurveysId = @PKID
order by ssq.Sequence, ssa.Sequence;
-- result set #4
select ssac.ID, ssac.SiteSurveyQuestionsId, ssac.Sequence, ssac.ColumnName 'Answer', null 'NextQuestionId'
from SiteSurveyAnswerColumns ssac inner join SiteSurveyQuestions ssq on ssq.id = ssac.SiteSurveyQuestionsId
where ssq.SiteSurveysId = @PKID
order by ssq.Sequence, ssac.Sequence;
-- result set #5
select ssacd.ID, ssacd.SiteSurveyAnswerColumnsId, ssacd.Sequence, ssacd.Data
from SiteSurveyAnswerColumnData ssacd
inner join SiteSurveyAnswerColumns ssac on ssac.id = ssacd.SiteSurveyAnswerColumnsId
inner join SiteSurveyQuestions ssq on ssq.id = ssac.SiteSurveyQuestionsId
where ssq.SiteSurveysId = @PKID
order by ssq.Sequence, ssac.Sequence, ssacd.Sequence;
-- result set #6
if ((@LoadResponseSummary = 1) and (@count > 0))
begin
select QId 'SiteSurveyQuestionsId', AId 'SiteSurveyAnswersId', AColId 'SiteSurveyAnswerColumnsId',
AnswerValue, ResponsePercent, ResponseTotal
from @responseSummary
order by QSeq, ASeq, AColID, AColSeq;
end
end