查询 - 如果多个记录ID#(非主键)匹配,请使用更晚的日期或更大的主键

时间:2013-04-08 18:40:05

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

我构建了一个MS Access数据库,可以通过调查来创建自定义报告。使用的调查应用程序没有向我们提供我们需要的报告。我通常会抓取数据(excel)并按照我们需要的方式将其导入访问和构建报告中。

这是第一次,我们让人们重新进行调查,因为他们正在更新某些内容,或者他们忘了添加内容。我需要能够获取最新的调查数据,以便在运行报告时不会出现重复。 (我的主要报告由几个子报告组成。如果为null,则某些子报告将不可见,并且任何未回答的问题都会被隐藏和缩小,以防止带有不必要空格的大量报告。)

 record ID (PK) |  FName   |  LName   | IDNum   | Completed
     1          |  Bob     |  Smith   |  57     | 3/31/2013 5:00pm
     2          |  Bob     |  Smith   |  57     | 3/31/2013 7:00pm

我想要记录ID 2或在晚上7点完成的记录。

查询和报告已经完成,所以我一直试图找到一种方法在我的查询的标准行中添加一行代码,以便在IDnum与多条记录匹配时获取最新记录。

过去几个小时,我一直在努力寻找最佳方法。我不认为将我的表修改为“没有重复的表”,因为数据库完成后,技术人员将使用它。他们要做的就是导入一个新的excel文件来覆盖表,查询会做一切来构建报告。我也不想手动删除重复的记录。

我知道我需要做一些与

相关的事情
 IIF(count(IDNum)>1, *something, *something)

*我被困在真假部分。我如何告诉访问它需要再次在表中检查以查找具有较大主键的记录?

我认为这很容易,但我想我错了。洛尔

我在MS Access上相当新,所以我知道我没有充分发挥潜力,我可能会以错误的角度去做。任何建议都会受到很大的赞赏 我是一名学生进入Info Systems,所以我真的想学习如何做到这一点。

3 个答案:

答案 0 :(得分:2)

我相信您正在寻找的查询是

SELECT t1.*
FROM YourTable t1 INNER JOIN 
    (SELECT IDNum, MAX(Completed) AS MaxOfCompleted 
     FROM YourTable GROUP BY IDNum
    ) t2
ON t1.IDNum = t2.IDNum AND t1.Completed = t2.MaxOfCompleted;

答案 1 :(得分:0)

当你使用if函数时,它应该是ifif。

答案 2 :(得分:0)

我建议使用相关的子查询,例如:

SELECT
Data.RecordID
, Data.FName
, Data.LName
, Data.IDNum
, Data.Completed

FROM
Data

WHERE
Data.Completed IN

(
SELECT TOP 1
DataSQ.Completed
FROM
Data as DataSQ

WHERE
DataSQ.IDNum = Data.IDNum

GROUP BY
DataSQ.Completed

ORDER BY
DataSQ.Completed DESC
)

GROUP BY
Data.RecordID
, Data.FName
, Data.LName
, Data.IDNum
, Data.Completed

;

<强>解释

您可以在主查询的WHERE子句中嵌入另一个SELECT查询,而不是使用Max或IIF等函数。嵌套查询用于确定每个IDNum的最近完成日期。与使用SELECT TOP 1 + ORDER BY直接从表中选择最近的调查不同,它只返回一条记录,嵌套查询中的WHERE子句返回主查询并为每个IDNum生成结果。这被称为每组前N个模式,我发现它非常有用。请注意,在嵌套查询中,您需要使用表名别名,以便Access能够区分这两个查询。

另外,我通常建议不要尝试使用表PK来执行排序。在许多情况下,PK订单值不是相关字段值的良好指标。

这段代码在测试虚拟数据时有效 - 祝您好运!