Access 2010:查找具有精选成绩的学生

时间:2015-02-01 02:13:41

标签: sql database ms-access-2010

我刚刚创建了一个用于分析学生的Access 2010数据库'考试成绩。我能够为所有学生取得成绩。有六个科目。找到所有六人中A的人很容易,但我现在要做的就是找到六分之五的A级成绩。同样,谁在任何两个科目中错过A.谁失败了一个主题?两个科目?我只是无法找到办法。非常感谢任何帮助。

PS:我脑子里想的是一个带有两个文本或组合框的表单,你将Grades放在一个,而另一个放在另一个中,以获得结果。例如,您在第一个中选择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"));

2 个答案:

答案 0 :(得分:0)

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

具有任何“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

这样您只需向SubjectsResults表添加行,而无需添加列并重新编辑查询。

答案 1 :(得分:0)

根据你的例子,你想做什么,只是遵循你的逻辑,因为我认为你有一个解决算法,我可以建议:

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

具有价值的可能等级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,这将有效。