【问题标题】:Access 2010: Find students with select gradesAccess 2010:查找具有特定成绩的学生
【发布时间】:2015-03-31 06:37:39
【问题描述】:

我刚刚创建了一个 Access 2010 数据库,用于分析学生在考试中的成绩。我能够正确地获得所有学生的成绩。有六个科目。找出谁在所有六项中获得 A 很容易,但我现在要做的是找出谁在六项中的任何五项中获得 A 级。同样,谁在任何两个科目中都错过了 A。谁在一门课上不及格?两个科目?我只是找不到办法。非常感谢任何帮助。

PS:我想到的是一个包含两个文本或组合框的表格,您可以将成绩放在一个中,将科目放在另一个中以获得结果。例如,您在第一个中选择 B,在第二个中选择三个,以获取在任何三个科目中获得 B 成绩的学生列表。只是不知道怎么弄。

我为找到所有科目都获得 A 的学生所做的工作:在查询中使用 A 作为标准。

SELECT 
    exam_grade.SNAME, 
    exam_grade.[Language Score], 
    exam_grade.[English Grade], 
    exam_grade.[Language Grade], 
    exam_grade.[Phy Grade], 
    exam_grade.[Chem Grade], 
    exam_grade.[Bio Grade], 
    exam_grade.[Math Grade], 
    exam_grade.DIVISION, 
    exam_grade.Result
FROM exam_grade
WHERE (((exam_grade.[English Grade])="A") 
    AND ((exam_grade.[Language Grade])="A") 
    AND ((exam_grade.[Phy Grade])="A") 
    AND ((exam_grade.[Chem Grade])="A") 
    AND ((exam_grade.[Bio Grade])="A") 
    AND ((exam_grade.[Math Grade])="A"));

【问题讨论】:

  • 欢迎来到 StackOverflow!当你寻求帮助时,你应该展示你的代码。
  • 抱歉,我没有要显示的代码。我只是不知道该怎么做。
  • 您说“找出谁在所有六个中都获得 A 很容易”。该代码将是解决其余问题的完美起点。你应该发布它。
  • 我添加了“A”作为所有等级的标准,如下所示:
  • 您应该将出现在源文件中的实际源代码与您的问题一起发布。

标签: sql database ms-access-2010


【解决方案1】:

当您将每个主题存储在其自己的列中(而不是被分解为行)时,您总是必须在每个查询中指定每个主题。这确实使查询在概念上更简单,因为它只是做布尔逻辑的问题:

成绩为“A”的学生:

SELECT 
    exam_grade.SNAME, 
    exam_grade.[Language Score], 
    exam_grade.[English Grade], 
    exam_grade.[Language Grade], 
    exam_grade.[Phy Grade], 
    exam_grade.[Chem Grade], 
    exam_grade.[Bio Grade], 
    exam_grade.[Math Grade], 
    exam_grade.DIVISION, 
    exam_grade.Result
FROM
    exam_grade
WHERE
    exam_grade.[English Grade]  = "A" OR
    exam_grade.[Language Grade] = "A" OR
    exam_grade.[Phy Grade]      = "A" OR
    exam_grade.[Chem Grade]     = "A" OR
    exam_grade.[Bio Grade]      = "A" OR
    exam_grade.[Math Grade]     = "A"

学生未通过任何科目:

....
WHERE
    exam_grade.[English Grade]  = "F" OR
    exam_grade.[Language Grade] = "F" OR
    exam_grade.[Phy Grade]      = "F" OR
    exam_grade.[Chem Grade]     = "F" OR
    exam_grade.[Bio Grade]      = "F" OR
    exam_grade.[Math Grade]     = "F"

...对于您拥有的每个查询,依此类推。

您可以通过采用分解的数据库结构来简化这一点,如下所示:

CREATE TABLE Students (
    StudentId bigint PRIMARY KEY IDENTITY(1,1),
    FirstName nvarchar(50),
    LastName nvarchar(50)
)

CREATE TABLE Subjects (
    SubjectId bigint PRIMARY KEY IDENTITY(1,1),
    Name nvarchar(50)
)

CREATE TABLE Results (
    StudentId bigint,
    SubjectId bigint, -- composite key with StudentId, assuming no student can take the same subject twice
    Grade     char(1) -- though storing the numeric score would be more flexible
)

然后找到任何科目不及格的学生(例如)

SELECT
    Students.FirstName,
    Students.LastName,
    FailedResults.FailedCount
FROM

    (SELECT
        Results.StudentId,
        COUNT(*) As FailedCount
    FROM
        Results
        INNER JOIN Subjects ON Results.SubjectId = Subjects.SubjectId
    WHERE
        Results.Grade = 'F'
    GROUP BY
        Results.StudentId
    ) As FailedResults

    INNER JOIN Students ON FailedResults.StudentId = Students.StudentId

这样您只需向Subjects 和Results 表中添加行,而无需添加列和重新编辑查询。

【讨论】:

  • 我认为问题是“找出谁在六分之内的任何五分中获得 A 级”,如果您阅读有关他的表格示例,情况会发生巨大变化......
  • @JuanRuizdeCastilla 我也看到了。我认为 OP 从 UI 角度考虑这一点而没有首先考虑获得所需数据结果所需的查询,这是一个错误。
  • 我认为这更像是算法问题(用于学习等)而不是现实生活中的问题,我也会提出我的答案,试图帮助他解决算法问题,无论你提供什么帮助也有真实的数据库图:)。
  • 所以我需要为每个年级创建一个带有“OR”标准的单独查询,对吧?
  • @Edwin 我认为正确的解决方案比这更复杂。我真的认为你应该先重新设计你的数据库。
【解决方案2】:

根据您的示例以及您想要做什么并遵循您的逻辑,因为我认为您有解决算法,我可以建议:

首先,您需要为每个等级设置一个值,例如我将等级简化为三个。

可能的 A、B、C 级及其价值

  • A = 3
  • B = 2
  • C = 1

然后你需要对改变的值求和,像这样:

 SELECT * FROM
    (SELECT id_student,
        CONVERT(INT,CASE language_grade
            WHEN 'A' THEN '3' 
            WHEN 'B' THEN '2' 
            WHEN 'C' THEN '1'
        END)
        +
        CONVERT(INT,CASE english_grade
            WHEN 'A' THEN '3' 
            WHEN 'B' THEN '2' 
            WHEN 'C' THEN '1'
        END)
        +
        CONVERT(INT,CASE chem_grade
            WHEN 'A' THEN '3' 
            WHEN 'B' THEN '2' 
            WHEN 'C' THEN '1'
        END) AS RESULT
 FROM test) TB
 WHERE RESULT >= 6

好吧,按照您的表格示例,您可以在第一个组合框中选择“A”成绩,然后输入数字 2,这意味着您至少需要 2 个成绩至少为“A”的科目,如果您评分'A' 的值为 3,您可以将该值乘以放在第二个文本框中的数字,结果为 6,所以您可以推断出其他正确的吗? ;)。 (不要忘记使用等于、大于或等于等来更改您的查询。)

PSDT

我知道这不是访问 sintax,但如果您可以“翻译”为访问 sintax,这将起作用。

【讨论】:

    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2015-05-21
    • 2023-02-06
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多