【问题标题】:Multiple choice answer T-SQL query多项选择答案 T-SQL 查询
【发布时间】:2017-04-15 08:20:31
【问题描述】:

查询是获取用户对一个问题选择的多项选择答案是否正确,如果正确则为1,否则为0

我有两个表question_answeruser_exam_answer,条目表在submitted_option_id 列中有用户提交的答案

user_exam_answer table

question_answer

当用户回答 (user_exam_answer) 与问题回答 (question_answer) 表匹配时,我尝试编写查询

select 
    count(1) as result 
from 
    (select 
         qa.question_id, 
         count(qa.correct_option_id) as col1, 
         count(sa.submited_option_id) as col2 
     from 
         question_answer qa
     left join 
         user_exam_answers sa on (sa.question_id = qa.question_id 
                                  and sa.submited_option_id = qa.correct_option_id 
                                  and sa.exam_id = 'html_001' 
                                  and sa.user_id = 'user_123')
     group by 
         qa.question_id
     having 
         count(qa.correct_option_id) = count(sa.submited_option_id) 
 ) as t

但问题是:

  • QA (question_answer.correct_option_id) 有 3 个条目,SA user_exam_answers.submited_option_id) 有 2 个条目,则查询正确并返回

  • QA (question_answer.correct_option_id) 有 2 个条目,SA (user_exam_answers.submited_option_id) 有 3 个条目,则查询正确并返回

  • QA (question_answer.correct_option_id) 有 2 个条目 SA (user_exam_answers.submited_option_id) 有 1 个条目,则查询正确并返回

何时

  • QA (question_answer.correct_option_id) 有 1 个条目,SA (user_exam_answers.submited_option_id) 有 2 个条目,则查询返回错误答案

我正在寻找一个对所有四个条件都成立的查询

【问题讨论】:

  • 您能否详细说明您的条件举个例子?并提供架构 (create table) 和数据 (insert into ...) 文本,而不是图片。
  • 在图片链接中可以看到条目
  • @Lokesh 不要将代码发布为图片,请按原样发布(文本)
  • 如果学生没有尝试回答,他们是否认为他们答错了,或者您只对跟踪尝试回答的结果感兴趣?
  • @Lokesh 欢迎来到 SO,如果您打算留下来,请学习如何提出好的问题,并帮助社区帮助您(反之亦然)。三个人已经花时间回答了,如果您提供了表架构、示例数据和对场景的清晰描述,您本可以为我们提供很多帮助。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

对于每个问题,列出预期答案和提交的答案(您需要 FULL OUTER JOIN 来执行此操作,LEFT 加入是不够的)并计算匹配数。然后将此计数与预期答案的计数进行比较。

select question_id, case when cnt = sum_test then 1 else 0 end as mark
from (
    select question_id, count(*) cnt, sum(test) sum_test
    from (
        select coalesce(q.question_id, s.question_id) as question_id, 
        correct_option_id, 
        submitted_option_id, 
        case when correct_option_id = submitted_option_id then 1 else 0 end as test
        from question_answer q full outer join user_exam_answer s 
        on q.question_id = s.question_id and q.correct_option_id = s.submitted_option_id
        ) x
    group by question_id
) y

您可以找到live demo here

【讨论】:

    【解决方案2】:

    目前还不清楚您要在这里做什么,但以下内容应该可以帮助您入门:

    select
        sa.user_id,
        sa.exam_id,
        qa.question_id,
        sa.submitted_option_id,
        qa.correct_option_id,
        case when sa.submitted_option_id = qa.correct_option_id then 1 else 0 end as question_score
    from
        question_answer qa     
        LEFT JOIN user_exam_answer sa ON
            uea.question_id = qa.question_id
    where
        sa.exam_id='html_001'
        and sa.user_id='user_123'
    

    我希望qa 表也有一个exam_id 列,但这不在您的图像中。

    【讨论】:

      【解决方案3】:

      请尝试以下...

      SELECT user_id,
             exam_id,
             question_answer.question_id AS question_id,
             submited_option_id,
             correct_option_id,
             CASE
                 WHEN correct_option_id = submited_option_id THEN
                     1
                 ELSE
                     0
             END AS marked_option_id
      FROM question_answer
      LEFT JOIN user_exam_answer ON question_answer.question_id = user_exam_answer.question_id
      ORDER BY user_id,
               exam_id,
               question_id;
      

      此查询使用LEFT JOIN 将两个表连接在一起,因此仍会返回未回答问题的记录。然后它将正确答案与为每条记录提供的答案进行比较,如果它们匹配,则返回值1,否则返回值0。然后,此比较的结果将作为字段 marked_option_id 包含在输出中。然后对生成的输出进行排序以方便阅读。

      如果您有任何问题或cmets,请随时发表相应的评论。

      【讨论】:

        猜你喜欢
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        相关资源
        最近更新 更多