【问题标题】:Create Iif() Statement or Query to check multiple values in multiples rows matched on ID创建 Iif() 语句或查询以检查与 ID 匹配的多行中的多个值
【发布时间】: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


【解决方案1】:

考虑更改您的 HAVING 子句,将 IIF() 值计数调整为 Student ID 实例的完整计数:

SELECT t.[Student ID], Count(t.[Registration Status]) AS [CountOfRegistrationStatus]
FROM [Registration Status Record] t
GROUP BY t.[Student ID]
HAVING SUM(IIF(((t.[Registration Status])="Complete") 
           AND ((t.[Notification Status])="Notified"), 1, 0)) = Count(*)

【讨论】:

  • 谢谢芭菲。我明天回来时会试试这个。
  • 冻糕...c'est冻糕!请原谅,请原谅......不过,这似乎完全符合我的预期。剩下的唯一问题(这可能更适合单独的问题)是弄清楚如何解释缺课的问题。例如,学生可能需要在 2016 年秋季和 2017 年春季注册,但只有 2016 年秋季的记录。您的查询将列出他们的 ID,给人一种假象,他们不完整。也许使用某种辅助表或基于日期的系统的附加查询在这里可能会有所帮助......我不确定。无论如何,谢谢美人!
  • 哈哈...谢谢@Violet!乐意效劳!不过,我不太理解你加薪的例外情况。任何学期未完成注册的学生不应出现在此查询中。
  • 哈哈,当然!再次感谢你。我会试着解释一下……我运行的这个数据库只跟踪状态,而不是注册本身(这是全校范围的数据库,很难链接到)。因此,确保学生拥有所有适用学期所需的行是一项手动任务。例如,在 2017 年秋季开始注册的当天,我将不得不手动添加带有 Semester 的新行作为“2017 年秋季”;如果我不这样做,此查询仍会报告每个人都已完成。我正在集思广益——追加查询、基于日期的宏……我认为应该没问题,但欢迎提出想法!
猜你喜欢
  • 2021-11-09
  • 1970-01-01
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多