【问题标题】:Query for students passed or not passed in specific Subjects [closed]查询特定科目通过或未通过的学生[关闭]
【发布时间】:2020-05-08 06:38:45
【问题描述】:

我有一个带有列标题的表格:

  • ID Student_Name
  • Roll_Number
  • Subject1MarksObtained
  • Subject1TotalMarks
  • Subject2MarksObtained
  • Subject2TotalMarks
  • Subject3MarksObtained
  • Subject3TotalMarks
  • Subject4MarksObtained
  • Subject4TotalMarks

我想编写一个查询来输出通过至少三门科目的个别学生的结果。

【问题讨论】:

  • 欢迎来到 SO!获取tour 并阅读How to Ask。然后提高您对数据库规范化的了解。主题类型需要单独的表格。将主题类型存储在一个字段中,而不是每个字段。
  • 什么值决定及格分数? @ComputerVersteher 您的反馈没有帮助,OP 有一个当前架构,只是想要一些帮助,我们不在这里判断,留给 codereview.stackexchange.com
  • @ChrisSchaller,不判断但同意 ComputerVersteher - 使用标准化数据结构所需的输出会简单得多。当前的安排可能需要 VBA 自定义函数。海报没有显示任何尝试解决,没有提供分析代码。
  • 对不起,伙计们,从数据纯粹主义者的角度来看,我当然同意,但这是一个非常简单和常见的问题...通过告诉 OP 仅针对此问题更改架构,这将产生很多问题,否则他们早就这样做了。 :)
  • 再想一想,如果主题不超过 4 个,则可以避免使用 VBA 自定义函数。但是,当您需要添加第 5 个或更多科目时会发生什么?

标签: mysql sql database ms-access database-design


【解决方案1】:

在没有看到数据的情况下,让我们做一些假设:

  1. 如果该科目获得的分数等于或超过该科目可获得的总分的 50%,则该科目获得及格
  2. 表的名字叫Enrollment

要返回已通过至少 3 门科目的学生列表,我们可以使用类似于以下内容的查询:

此解决方案使用 CASE 对每个主题评估 1 表示通过,0 表示失败,然后我们将这些结果相加并仅返回得分为 3 或更高的行。

SELECT ID, Student_Name, Roll_Number
FROM Enrollment
WHERE 
  ( CASE WHEN (Subject1MarksObtained / Subject1TotalMarks) >= 0.5 THEN 1 ELSE 0 END
  + CASE WHEN (Subject2MarksObtained / Subject2TotalMarks) >= 0.5 THEN 1 ELSE 0 END
  + CASE WHEN (Subject3MarksObtained / Subject3TotalMarks) >= 0.5 THEN 1 ELSE 0 END
  + CASE WHEN (Subject4MarksObtained / Subject4TotalMarks) >= 0.5 THEN 1 ELSE 0 END
  ) >= 3  

有不同的方法来解决这个问题,但是这个查询很容易阅读并且可以完成工作。

如果您正在查询访问表,则不支持CASE WHEN,但您可以使用IIFSWITCH 来获得相同的结果:

SELECT ID, Student_Name, Roll_Number
FROM Enrollment
WHERE 
  ( IIF( (Subject1MarksObtained / Subject1TotalMarks) >= 0.5, 1, 0)
  + IIF( (Subject2MarksObtained / Subject2TotalMarks) >= 0.5, 1, 0)
  + IIF( (Subject3MarksObtained / Subject3TotalMarks) >= 0.5, 1, 0)
  + IIF( (Subject4MarksObtained / Subject4TotalMarks) >= 0.5, 1, 0)
  ) >= 3  

【讨论】:

  • 访问查询对象不支持这个。
  • 是access还是MySQL? OP还不清楚,反正你可以在访问中使用相同的逻辑,只是语法略有不同。
  • 我认为 Access 是前端,因为标签可能是他们正在构建查询的地方。所以在 Access 查询中:IIf(Subject1MarksObtained>50,1,0) + IIf(Subject2MarksObtained>50,1,0) + IIf(Subject3MarksObtained>50,1,0) + IIf(Subject4MarksObtained>50,1,0)。在 >=3 的计算字段下应用过滤条件。
  • 关于 DBMS 的问题不清楚。不清楚的问题值得投反对票、接近投票和 cmets,而不是答案。
  • 谢谢你们,你们的帮助真的很大。 @chris-shaller 解决方案对我有用。虽然我不得不对我的表结构进行一些更改。
【解决方案2】:

让我们先修复损坏的架构。标准化设计可能看起来如下:

Student
  ID 
  Student_Name
  Roll_Number

Results
 StudentID
 Subject
 Mark

【讨论】:

  • 谢谢,问题已解决...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
相关资源
最近更新 更多