我在Microsoft Access 2003上遇到了麻烦,它在抱怨这一说法:

select cardnr
from change
where  year(date)<2009
group by cardnr
having max(time+date) = (time+date) and cardto='VIP'

我想做的是,对于表格中的每一个不同的cardn,都可以在2009年之前找到最新的(时间+日期)的行,然后只需选择CardTo ='vip'的行即可。

验证器 说没关系,Access说这不行。

这是我收到的消息:“您尝试执行一个不包括指定表达式'最大(时间+date)=时间+date和cardTo ='vip'和cardnr ='的查询,作为聚合函数的一部分。”

有人可以解释我做错了什么,做正确的方法吗?谢谢

注意:字段和表名称已翻译,并且不会与任何保留单词相撞,我对名称没有任何麻烦。

有帮助吗?

解决方案

尝试这样思考 - 在完成聚合后应用。因此,它不能与未聚集的表达式(既不用于时间+日期,也不适合卡托)进行比较。

但是,要获得最后一个(原理是相同的,以使行与其他汇总功能相关的行与Weel相关)时间和日期,您可以做类似的事情:

SELECT cardnr
FROM change main
WHERE time+date IN (SELECT MAX(time+date) 
                    FROM change sub
                    WHERE sub.cardnr = main.cardnr AND 
                          year(date)<2009 
                          AND cardto='VIP')

(假设您的时间字段上的日期部分对于所有记录都是相同的;在某些情况下,在某些情况下,在现场名称中有两个字段不符合您的最大利益,并且在字段名称中使用保留的单词可能会适得其反)

它之所以起作用,是因为该子查询仅在您从外部查询中感兴趣的记录上过滤。

将同年(日期)<200和cardTo ='vip'应用于外部查询可以进一步提高性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top