2013-08-05 2 views
1

У меня есть следующие таблицы и соответствующие атрибуты:Как мне сделать этот запрос, получить результат, который нам нужен?

Survey: 
    SurveyID int, 
    SurveyTitle nvarchar(50) 

SurveyQuestions 
QuestionId int, 
SurveyId fk from Survey table 
Question nvarchar(100) 
QuestionOrder int (eg: 1,2,3) 
AnswerType char(1) (M. for Multiple choice answers like Checkbox, S for single like radiobuttion, T for Free Text 


SurveyChoices 
ChoiceId int 
QuestionId int fk from SurveyQuestions 
Choice nvarchar(255) (eg: Choices for each question entered by Admin 
IsCorrect bit (1 for Correct choice, 0 for incorrect choice. 

SurveyAnswers 
AnswerId int 
ChoiceId int fk from SurveyChoices 
QuetionId int fk from SurveyQuestions 
ChoiceText nvarchar(2000) (For FreeText) 

Вот что моя потребность.

Мы хотели бы задать вопрос для КАЖДОГО обследования, а затем выбрать пользователя и, наконец, правильный ответ или ответы.

Пользователи могут проверить более 1 несколько вариантов ответа (чекбоксы)

Таким образом, расположение должно быть что-то вроде:

Question        Your Choice      Correct Answer(s) 
How many days in a year?     365       365 
Tom Cruise Starred in 
what movies? Check all that apply  Rain Man      Rain Man 
             Risky Business     Risky Business 
             Mission Possible    Mission Impossible 

Вы можете увидеть схему SQL на скрипку

http://sqlfiddle.com/#!3/4c642/1

Предоставлено Стивом Фордом. Еще раз спасибо Стив.

Моя попытка запроса ниже:

SELECT DISTINCT SQ.question, SC.Choice As CorrectAnswer 
          FROM surveyquestions AS SQ 
          INNER JOIN surveychoices AS SC ON SQ.QuestionID = SC.QuestionID 
          INNER JOIN surveyanswers AS SA ON SA.QuestionID = SQ.QuestionID AND SC.choiceId = SA.choiceId AND SA.username = 'John.Doe' 
          WHERE SQ.SurveyID = 10 

вопросы являются правильными.

Правильные ответы не совсем корректны, потому что, если более чем один выбор правилен, как в случае с фильмами Tom Cruise, все они не отображаются.

Мы хотели бы отобразить все правильные ответы на каждый вопрос.

Наконец-то я не могу понять, как отображать пользовательские варианты.

Ваша экспертная помощь с благодарностью.

enter image description here

+1

Не могли бы вы приложить конкретный пример того, как должен выглядеть результат? (например, Джон Доу) –

+0

Несомненно @FabianBigler, я обновил свой код выше. Это не выглядит так ясно, хотя, надеюсь, это будет для вас. Это не совсем правильный вывод, но это макет. Вопросы выходят нормально. Но выбор пользователя должен показывать ВСЕ варианты на вопрос. То же самое с правильными ответами. Большое спасибо за помощь –

+0

@ChidiOkeh это поможет, если вы добавите свои новые данные опроса в часть настройки демонстрации SQLFiddle –

ответ

1

Я думаю, что по существу вы хотите GROUP_CONCAT правильный выбор и получить ответы отдельно, то присоединиться к вопросу

что-то вроде этого

WITH CorrectChoices AS 
(
    SELECT QuestionID, LEFT(CorrectChoice , LEN(CorrectChoice)-1) AS Choice 
    FROM SurveyChoices AS extern 
    CROSS APPLY 
    (
    SELECT Choice + ', ' 
    FROM SurveyChoices AS intern 
    WHERE extern.QuestionID = intern.QuestionID 
    AND intern.IsCorrect=1 
    ORDER BY Choice 
    FOR XML PATH('') 
) pre_trimmed (CorrectChoice) 
    GROUP BY QuestionID, CorrectChoice 
) 
, Answer AS 
(
    SELECT QuestionID, UserName, LEFT(CorrectChoice , LEN(CorrectChoice)-1) AS Choice 
    FROM SurveyAnswers AS extern 
    CROSS APPLY 
    (
    SELECT Choice + ', ' 
    FROM SurveyAnswers intern 
    INNER JOIN SurveyChoices SC ON SC.QuestionId = intern.QuestionID 
           AND SC.ChoiceID = intern.ChoiceID 
    WHERE extern.QuestionID = intern.QuestionID 
    ORDER BY Choice 
    FOR XML PATH('') 
) pre_trimmed (CorrectChoice) 
    GROUP BY QuestionID, UserName, CorrectChoice 
) 

SELECT SQ.Question, CC.Choice, A.Choice Answer, 
     CASE WHEN CC.Choice = A.Choice THEN 'Correct' ELSE 'Wrong' END 
FROM SurveyQuestions SQ 
LEFT JOIN CorrectChoices CC ON CC.QuestionID = SQ.QuestionID 
LEFT JOIN Answer A ON A.QuestionID =SQ.QuestionID 
WHERE SQ.SurveyID = 10 
AND UserName='John Doe' 

demo

0
SELECT Q.question, C.choice, 
    (SELECT A1.choice FROM SurveyChoices A1 WHERE A1.choiceid = A.choiceid) AS YourChoice 
FROM SurveyQuestions AS Q 
left JOIN 
    (SELECT C1.questionid, C1.Choice from SurveyChoices C1 WHERE C1.iscorrect = 1) AS C 
    ON Q.questionid = C.questionid 
left JOIN SurveyAnswers A ON A.questionid = Q.questionid 
WHERE Q.surveyid = 10 ORDER BY Q.questionorder; 

http://sqlfiddle.com/#!3/4c642/99

+0

Вы двое абсолютно потрясающие.Чтобы быть уверенным, @TI, который из ваших столбцов является правильным ответом. Есть выбор или ответ? Кроме того, я заметил, что в ответах на флажке, если есть 4 варианта и 3 из этих 4 параметров верны, если один правильный флажок не установлен, он должен считаться неправильным ответом. Это не происходит с вашим кодом TI. Барбара, большое спасибо. Я собираюсь протестировать ваш сейчас, но я вижу ту же проблему с флажком с правильным ответом, который не проверен и не засчитан. Вы, ребята, творчески удивительны. THANKS AGAIN Также Barabara, ваш не фильтрует по имени пользователя. –

Смежные вопросы