3

進行中の調査アンケートの設計の一環として、以下のコードを使用して、調査の質問の総数、正解数、正解率を決定します。

私が問題を抱えている 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
4

1 に答える 1

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

ChoiceID が一意である場合、結合条件に QuestionID を含める必要はありません。

また、テーブルに列が必要かどうかはわかりません。ChoiceTextおそらく1つのテーブルにのみあるはずです。私の推測では、そのテーブルはSurveyChoices.

于 2013-07-25T19:07:51.410 に答える