У меня есть анкета-приложение, в котором пользователь будет отправлять ответы. Некоторые вопросы основаны на тексте, а некоторые имеют фиксированные параметры.
Значения сохраняются в таблице tAnswers
либо как введенное текстовое значение, либо как Id
выбранной опции. Существует столбец QuestionTypeId
, который определяет, является ли ответ ссылкой на tOptions.Id
.
Я хочу выбрать ответы, возвращая введенное значение или значение, относящееся к выбранному идентификатору.
Например;
SET NOCOUNT ON
DECLARE @tSubmissions TABLE (Id INT)
DECLARE @tSubmissionQuestions TABLE (SubmissionId INT, QuestionId INT)
DECLARE @tQuestions TABLE (Id INT, QuestionText NVARCHAR(MAX), ColName NVARCHAR(MAX), QuestionTypeId INT)
DECLARE @tOptions TABLE (Id INT, OptionValue NVARCHAR(MAX), OptionGroupId INT)
DECLARE @tAnswers TABLE (Id INT IDENTITY(1,1), SubmissionId INT, QuestionId INT, AnswerValue NVARCHAR(MAX))
INSERT INTO @tQuestions VALUES (1, 'What is your name?', 'Name', 1)
INSERT INTO @tQuestions VALUES (2, 'What is your age?', 'Age', 1)
INSERT INTO @tQuestions VALUES (3, 'What is your gender?', 'Gender', 2)
INSERT INTO @tQuestions VALUES (4, 'What is your favourite colour?', 'Colour', 2)
-- Answers for question 3 - gender
INSERT INTO @tOptions VALUES (1, 'Male', 1)
INSERT INTO @tOptions VALUES (2, 'Female', 1)
-- answers for question 4 - colour
INSERT INTO @tOptions VALUES (3, 'Blue', 2)
INSERT INTO @tOptions VALUES (4, 'Green', 2)
INSERT INTO @tOptions VALUES (5, 'Red', 2)
INSERT INTO @tOptions VALUES (6, 'Yellow', 2)
INSERT INTO @tSubmissions VALUES (1)
INSERT INTO @tSubmissions VALUES (2)
INSERT INTO @tSubmissions VALUES (3)
INSERT INTO @tSubmissionQuestions VALUES (1, 1)
INSERT INTO @tSubmissionQuestions VALUES (1, 2)
INSERT INTO @tSubmissionQuestions VALUES (1, 3)
INSERT INTO @tSubmissionQuestions VALUES (1, 4)
INSERT INTO @tSubmissionQuestions VALUES (2, 1)
INSERT INTO @tSubmissionQuestions VALUES (2, 2)
INSERT INTO @tSubmissionQuestions VALUES (2, 3)
INSERT INTO @tSubmissionQuestions VALUES (2, 4)
INSERT INTO @tSubmissionQuestions VALUES (3, 1)
INSERT INTO @tSubmissionQuestions VALUES (3, 2)
INSERT INTO @tSubmissionQuestions VALUES (3, 3)
INSERT INTO @tSubmissionQuestions VALUES (3, 4)
-- form submissions
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (1, 1, 'Tony Stark')
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (1, 2, '39')
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (1, 3, '1') -- reference to @tOptions
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (1, 4, '5') -- reference to @tOptions
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (2, 1, 'Pepper Potts')
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (2, 2, '38')
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (2, 3, '2') -- reference to @tOptions
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (2, 4, '6') -- reference to @tOptions
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (3, 1, 'James Rhodes')
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (3, 2, '41') -- has choosen to not answer question 3
INSERT INTO @tAnswers (SubmissionId, QuestionId, AnswerValue) VALUES (3, 4, '3') -- reference to @tOptions
SELECT
s.Id as SubmissionId, q.Id as QuestionId, a.AnswerValue
FROM
@tSubmissions s
INNER JOIN @tSubmissionQuestions sq
ON sq.SubmissionId = s.Id
INNER JOIN @tQuestions q
ON q.Id = sq.QuestionId
LEFT JOIN @tAnswers a
ON a.QuestionId = q.Id
AND a.SubmissionId = s.Id
DBFiddle
Это возвращает;
SubmissionId | QuestionId | AnswerValue
=============|============|===============
1 | 1 | Tony Stark
1 | 2 | 39
1 | 3 | 1 <-- this is the Id of the selected option
1 | 4 | 5 <-- this is the Id of the selected option
2 | 1 | Pepper Potts
2 | 2 | 38
2 | 3 | 2 <-- this is the Id of the selected option
2 | 4 | 6 <-- this is the Id of the selected option
3 | 1 | James Rhodes
3 | 2 | 41
3 | 3 | NULL <-- the option was not selected
3 | 4 | 3 <-- this is the Id of the option
Вместо этого я хотел бы;
SubmissionId | QuestionId | AnswerValue
=============|============|===============
1 | 1 | Tony Stark
1 | 2 | 39
1 | 3 | Male <-- this is the value of the selected option
1 | 4 | Red <-- this is the value of the selected option
2 | 1 | Pepper Potts
2 | 2 | 38
2 | 3 | Female <-- this is the value of the selected option
2 | 4 | Yellow <-- this is the value of the selected option
3 | 1 | James Rhodes
3 | 2 | 41
3 | 3 | NULL <-- the option was not selected
3 | 4 | Blue <-- this is the value of the selected option
Как условно получить значения из таблицы tOptions
?