SQL查询帮助-计分多项选择测试

时间:2020-03-05 18:42:01  来源:igfitidea点击:

假设我有一个Student表,它有一个int ID。我有一组固定的10个多项选择题,其中有5个可能的答案。我有一个标准化的答案表,其中包含问题ID,Student.answer(1-5)和Student.ID

我正在尝试编写一个查询,该查询将返回一定百分比的所有分数。为此,我编写了一个简单的UDF,它接受Student.answers和正确的答案,因此它具有20个参数。

我开始怀疑对答案表进行非规范化,将其放入我的应用程序并让我的应用程序进行评分是否更好。

任何人都可以解决这样的事情并拥有洞察力吗?

解决方案

回答

我可能会把它留给应用程序来执行评分。请查看Jeff Atwood的"也许规范化不是正常"。

回答

从长远来看,我们所讨论的体系结构可能会变得非常繁琐,并且如果我们需要更改问题,则意味着我们正在使用的UDF会有更多更改。

我认为我们可能可以在代码中进行分析,而不必对数据库进行非规范化。归一化也可能会导致灵活性不足,或者至少会增加后续更新的费用。

回答

绝对不可能,我们绝对要保持其标准化。甚至没有那么难查询。

基本上,我们想让学生将正确答案与该问题的总答案结合起来,然后计算一次。这将为我们提供正确的百分比。对每个学生进行此操作,然后在where子句中输入最小的正确百分比。

回答

非规范化通常被认为是不得已的方法。该问题似乎与非常普遍的调查应用程序非常相似。没有看到数据模型,很难提出解决方案,但是我会说这绝对是可能的。我想知道为什么我们需要该功能20个参数?

在大多数情况下,基于关系集的解决方案将更简单,更快捷。

回答

如果我正确理解了架构并提出了疑问,那么这样的事情怎么样:

select student_name, score
from students
  join (select student_answers.student_id, count(*) as score
        from student_answers, answer_key
        group by student_id
        where student_answers.question_id = answer_key.question_id
          and student_answers.answer = answer_key.answer)
  as student_scores on students.student_id = student_scores.student_id
where score >= 7
order by score, student_name

例如,应该选择分数为7或者更高的学生。只需根据目的调整where子句。

回答

这个查询应该很容易...假设我们在问题表中存储了正确的答案。我们确实在问题表中存储了正确答案,对吗?