我刚刚创建了一个用于分析学生的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"));
答案 0 :(得分:0)
当您将每个主题存储在自己的列中(而不是分解为行)时,您将始终必须在每个查询中指定每个主题。这确实使查询在概念上更简单,因为它只是做布尔逻辑的问题:
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
表添加行,而无需添加列并重新编辑查询。
答案 1 :(得分:0)
根据你的例子,你想做什么,只是遵循你的逻辑,因为我认为你有一个解决算法,我可以建议:
首先,您需要为每个等级设置一个值,例如我将三个等级简化。
具有价值的可能等级A,B,C
然后你需要对改变的值求和,如下所示:
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,这将有效。