2

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

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

 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 的新手,所以我知道我没有充分发挥潜力,而且我可能会以错误的角度进行。任何建议将不胜感激。
我是一名进入信息系统的学生,所以我真的很想学习如何做到这一点。

4

3 回答 3

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;
于 2013-04-08T19:01:39.577 回答
0

当您使用 if 函数时,它应该是 iif 而不是 iff。

于 2013-04-08T19:04:37.853 回答
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 顺序值并不能很好地指示相关字段的值。

此代码在对虚拟数据进行测试时有效 - 祝你好运!

于 2013-04-08T19:35:07.133 回答