【发布时间】:2016-04-18 20:43:48
【问题描述】:
我正在管理一个学生数据库。每个学期,我们都会为学生注册课程,并在表格[Registration Status Record] 中跟踪此进度。表格中的每一行基本上由:[Student ID]、[Semester]、[Registration Status] 和[Notification Status] 组成。
示例数据:
-
[Semester](学生注册的学期)- 2016 年秋季,2017 年春季
-
Registration Status(学生注册是否完成)- 完成、需要、错误
-
[Notification Status](一旦注册完成,是否通知学生)- 已通知,待处理
我想要创建另一个查询或 Iif() 语句,它将检查任何给定学生的所有行并返回他们的整体注册状态,而与学期无关。
如果使用 Iif() 语句,以下是我要寻找的一些标准:
- 如果学生成功注册了所有学期并且已收到有关每个学期的通知,它会报告类似“所有注册已完成,学生已完全通知”之类的信息。
- 如果学生已完全注册但只收到一个学期的通知,“所有注册完成,通知未完成”。
- 等等……我想你明白了。
就 Iif() 语句而言,我不知道从哪里开始。至于查询构建,我同样难过。我想我至少会为 100% 完成的学生制作一个。以下是我的微弱尝试,基于我找到的另一个答案 (https://dba.stackexchange.com/questions/1775/matching-single-column-against-multiple-values-without-self-joining-table-in-mys)。其想法是此查询应显示所有完全完成的学生(所有学期 100% 已注册并收到通知):
SELECT [Registration Status Record].[Student ID], Count([Registration Status Record].[Registration Status]) AS [CountOfRegistration Status]
FROM [Registration Status Record]
WHERE ((([Registration Status Record].[Registration Status])="Complete") AND (([Registration Status Record].[Notification Status])="Notified"))
GROUP BY [Registration Status Record].[Student ID]
HAVING (((Count([Registration Status Record].[Registration Status]))>0));
我的期望是,例如,如果一个学生只有 2017 年春季的注册并且已经 100% 完成,它将显示给他们。相反,如果他们在 2016 年秋季和 2017 年春季都拥有它并且它已经 100% 完成,它也会向他们展示。但是,如果他们两个学期都有注册并且两个学期都没有完全完成,则不会显示。但确实如此!例如,它返回的一名学生在 2016 年秋季完成了 100%,但在 2017 年春季只完成了一部分(他们的注册已完成,但尚未收到通知)。
我知道一定有办法做到这一点。我可以用英语或西班牙语表达我想要的东西,但不能用 SQL。感谢您提供任何帮助......并为这个问题的脱节性质道歉。
【问题讨论】:
-
由于您使用了
Count,因此您已经创建了一个聚合查询。由于您唯一的GROUP BY字段是StudentID,因此您将获得任何学生的记录,其中任何记录的状态为“完成”且通知为“已通知”。尝试删除 count 字段和HAVING子句,看看是否可以为您提供所需的原始数据。如果您需要计数,请根据此计数创建另一个查询注册状态。发表关于您的发现的评论,我可以在回家时提供帮助。 -
感谢您的回复。我尝试删除 Count 字段,尽管它的行为似乎相似。例如,一名学生报名参加了春季课程,但秋季课程却出现了“错误”。以下是修改后的查询内容:
SELECT [Registration Status Record].[Student ID] FROM [Registration Status Record] WHERE ((([Registration Status Record].[Registration Status])="Complete") AND (([Registration Status Record].[Notification Status])="Notified")) GROUP BY [Registration Status Record].[Student ID];我现在必须离开今晚,但我明天会重新访问。 -
Christopher,您可以看到下面 Parfait 的解决方案满足了我的需求。尽管如此,再次感谢您的帮助!
标签: sql ms-access if-statement ms-access-2013 jet