進行中の調査アンケートの設計の一環として、以下のコードを使用して、調査の質問の総数、正解数、正解率を決定します。
私が問題を抱えている 1 つの問題は、チェックボックス リストの値を計算する方法です。
アンケートは、ラジオ ボタンとチェックボックス リストの値の形式で提供されます。
ラジオ ボタンの選択肢では、1 つの選択肢のみが選択されます。
ただし、checkboxlist の場合、複数の値が存在する可能性があります。
これにより、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
私はそれをコーディングする方法を知りません。
以下は、checkboxlist の値を除いて、上記のほぼすべてを実行するコードです。
よろしくお願いします。
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