2013-07-25 2 views
3

В рамках нашего текущего проекта анкетирования опроса приведенный ниже код используется для определения общего количества вопросов для опроса, количества правильных ответов и процент правильных ответов.Как вычислить значения checkboxlist?

У меня есть проблема с вычислением значений checkboxlist.

Опрос выполнен в виде переключателей и значений флажков.

С выбором радиокнопки выбран только один выбор.

Но для checkboxlist может быть более 1 значения.

Это затрудняет вычисление значений checkboxlist.

Мое мышление вычислить Флажок значения следующим образом:

-- plus 1 for each correct answer 
-- minus 1 for each wrong answer 
-- total from that then divided by the number of correct answers to the question 

Я просто не знаю, как идти о кодировании это.

Ниже приведен код, который выполняет почти все перечисленные выше, за исключением значений флажков.

Большое спасибо.

SELECT question, choice, CorrectAnswer, TotalAnswers, CorrectAnswers, 
           (CorrectAnswers * 100)/TotalAnswers AS totalPercent, 
           convert(varchar, (CorrectAnswers * 100)/TotalAnswers) + '%' AS totalPercentStr 
           FROM (
            SELECT sq.questionid, sq.question, sc.choice, sq.CorrectAnswer, 
             COUNT(sq.questionId) OVER (PARTITION BY sq.SurveyId) AS TotalAnswers, 
             COUNT(CASE WHEN sa.choiceid IS NOT NULL AND sc.choice = sq.CorrectAnswer THEN 1 ELSE NULL END) OVER (PARTITION BY sq.SurveyId) AS CorrectAnswers 
            FROM Survey s 
            INNER JOIN SurveyQuestions AS sq ON s.surveyId = sq.SurveyId 
            INNER JOIN SurveyChoices AS sc ON sq.questionId = sc.questionId 
            LEFT JOIN SurveyAnswers AS sa ON sc.choiceId = sa.choiceId AND sa.username = @UserName 
            WHERE s.surveyId = @SurveyId 
            AND (sa.username IS NOT NULL 
            OR 
             (sa.username IS NULL AND sc.choice = sq.CorrectAnswer)) 
            ) AS derived 
           ORDER BY questionId; 
CREATE TABLE [dbo].[Survey](
    [SurveyID] [int] IDENTITY(1,1) NOT NULL, 
    [Title] [varchar](50) NULL, 
    [Description] [varchar](max) NULL 

CREATE TABLE [dbo].[SurveyQuestions](
    [QuestionID] [int] IDENTITY(1,1) NOT NULL, 
    [SurveyID] [int] NULL, 
    [Question] [varchar](255) NULL, 
    [AnswerType] [char](1) NULL, 
    [CorrectAnswer] [nvarchar](255) NULL, 
    [QuestionOrder] [int] NULL 


CREATE TABLE [dbo].[SurveyChoices](
    [ChoiceID] [int] IDENTITY(1,1) NOT NULL, 
    [QuestionID] [int] NOT NULL, 
    [Choice] [nvarchar](255) NOT NULL 

CREATE TABLE [dbo].[SurveyAnswers](
    [AnswerID] [int] IDENTITY(1,1) NOT NULL, 
    [QuestionID] [int] NOT NULL, 
    [ChoiceID] [int] NULL, 
    [ChoiceText] [varchar](max) NULL, 
    [UserName] [varchar](50) NULL 
+0

Можете ли вы опубликовать структуры таблиц? –

+0

@ mr.Reband, я обновил вопрос выше с помощью табличных структур. Спасибо за ваш ответ. По какой-то причине таблицы сгруппированы вместе. –

+0

В случае checkboxlist, как может 'CorrectAnswer' хранить несколько ответов? Похоже, что должна быть дополнительная таблица, называемая «CorrectAnswers» или что-то еще, со структурой, подобной «SurveyAnswers». –

ответ

0

Я рекомендую добавить таблицу, как это:

CREATE TABLE [dbo].[CorrectAnswers](
    [AnswerID] [int] IDENTITY(1,1) NOT NULL, 
    [QuestionID] [int] NOT NULL, 
    [ChoiceID] [int] NULL, 
    [ChoiceText] [varchar](max) NULL 
) 

... и до заполнения его со всеми правильными ответами.

Когда пользователь нажимает кнопку отправки, таблица SurveyAnswers будет заполнена. Я предполагаю, что это уже сделано (В противном случае, что было бы точку SurveyAnswers таблицы)

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

SELECT 
    sc.QuestionID, 
    sc.ChoiceID, 
    case when sa.choiceID IS NOT NULL then 1 else 0 end as userSelected, 
    case when ca.choiceID IS NOT NULL then 1 else 0 end as isCorrectAnswer 
from dbo.SurveyChoices sc 
LEFT JOIN dbo.SurveyAnswers sa on sc.ChoiceID = sa.choiceID AND sc.QuestionID = sa.QuestionID 
LEFT JOIN dbo.CorrectAnswers ca on sc.ChoiceID = ca.choiceID AND sc.QuestionID = ca.QuestionID 

Обратите внимание: если ваш идентификатор выбора уникален, вам не нужно включать QuestionID в условие соединения.

Кроме того, не уверен, что вам нужен столбец ChoiceText в таблице - он, вероятно, должен быть только в одной таблице, и я предполагаю, что таблица будет SurveyChoices.

+0

@ mr.Rebrand, я собираюсь опробовать ваше предлагаемое решение. Спасибо вам обоим. Надеюсь, кто-то может извлечь из вас щедрую помощь. Я догадываюсь, что я все еще смущен относительно того, как сохранить флажки. Сохраните ли я, введя A, B, а затем отправьте, если A, B являются правильными ответами? –

+0

В режиме «Отправить» вам необходимо просмотреть все проверенные пользователем элементы и вставить одну запись в «SurveyAnswers» за каждый отмеченный элемент. В этот момент не должно быть никаких проверок корректности, поскольку вы все же хотите зафиксировать то, что выбрал пользователь, независимо от того, является ли оно правильным. –

+0

@ mr.Rebrand, как это отличается от таблицы опросов? В таблице SurveyChoices загружены все возможные ответы. Правильный ответ или в случае флажков, правильные ответы загружаются в SurveyQuestions. Выбор пользователя отправляется в SurveyAnswers, а затем сравнивается с правильным ответом (-ами) в таблице SurveyQuestions. –