基于设置规则在MS Access查询中返回唯一值

时间:2015-03-27 09:23:08

标签: sql ms-access ms-access-2010

我有一个返回数据集的查询,其中包含UserID,CourseID,课程完成日期,课程注册日期和状态(成功,未尝试,未完成)。

然而,允许人们多次上课。

对于1个报告,我需要根据以下规则获得一个唯一的记录集(基于Combined UserID和CourseID ):

  1. 如果学员成功完成课程,则只接受该值
  2. 如果学员多次成功完成课程,请参加第一个完成日期。
  3. 如果学习者没有成功完成课程,请在最后一个注册日期。
  4. 我知道如何创建仅返回唯一(Distinct)值的查询,但不知道如何使用一组规则来执行此操作。

1 个答案:

答案 0 :(得分:0)

我看到这有点老了。我不知道这是否直接回答了您的问题,因为我无法想出一种方法来编写单个查询来执行此操作。然而,我确实想出了一个我自己测试的解决方案。

使用3个表格和4个查询,我认为我已经制作了您正在寻找的结果。

我写的第一个问题是获得" First Completed"日期。因为一个人只完成一次课程,这是他们的第一次完成,这实际上意味着你的标准1和2是相同的。

我是通过对UserID和CourseID进行分组然后获取StatusCompleteionDate的MIN,其中Status等于1来实现此目的。

SELECT tblRegistrations.UserID, tblRegistrations.CourseID, Min(tblRegistrations.CourseCompletionDate) AS FirstCompleted
FROM tblRegistrations
WHERE ((tblRegistrations.StatusID)=1)
GROUP BY tblRegistrations.UserID, tblRegistrations.CourseID;

我写的第二个问题是获得"最后未完成"注册日期。我再次对UserID和CourseID进行了分组,但是这次我使用了CourseRegistrationDate的最大MAX来获取最后一次尝试这个课程而没有完成(状态等于3)

SELECT tblRegistrations.UserID, tblRegistrations.CourseID, Max(tblRegistrations.CourseRegistrationDate) AS LastAttempt
FROM tblRegistrations
WHERE (((tblRegistrations.StatusID)=3))
GROUP BY tblRegistrations.UserID, tblRegistrations.CourseID;

我写的第三个查询是获取唯一的UserID / CourseID关系,并简单地将它们分组。

SELECT tblRegistrations.CourseID, tblRegistrations.UserID
FROM tblRegistrations
GROUP BY tblRegistrations.CourseID, tblRegistrations.UserID;

最后,我编写了结果查询,确保提取每个UserID / CourseID组合,然后显示它是否已完成,以及请求的日期。

SELECT qryUserCourses.UserID, qryUserCourses.CourseID, Nz([FirstCompleted],[LastAttempt]) AS ResultDate, IIf([FirstCompleted],"Completed","Not Completed") AS Result
FROM (qryUserCourses 
LEFT JOIN qryFirstCompleted ON (qryUserCourses.CourseID = qryFirstCompleted.CourseID) AND (qryUserCourses.UserID = qryFirstCompleted.UserID)) 
LEFT JOIN qryLastNotCompleted ON (qryUserCourses.CourseID = qryLastNotCompleted.CourseID) AND (qryUserCourses.UserID = qryLastNotCompleted.UserID);

这为我生成了一个UserID,CourseID,日期和完成状态列表。