SQL语句HAVING MAX(某些+东西)=某些+东西

时间:2010-04-19 20:27:54

标签: sql ms-access group-by aggregate having

我遇到了Microsoft Access 2003的问题,它抱怨这句话:

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

我想要做的是,对于表中的每个不同的cardnr,找到具有最新(时间+日期)的行,在2009年之前,然后只选择cardto ='VIP'的行。

validator表示没关系,Access表示不行。

这是我收到的消息:“您尝试执行的查询不包含指定的表达式'max(时间+日期)=时间+日期和cardto ='VIP'和cardnr ='作为聚合的一部分功能“。

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

注意:字段和表名被翻译,不会与任何保留字冲突,我对名称没有任何问题。

1 个答案:

答案 0 :(得分:3)

尝试这样想 - 在聚合完成后应用HAVING。 因此,它无法与未聚合的表达式进行比较(时间+日期,也不适用于cardto)。

但是,要获得最后一个(原则与获取与其他聚合函数相关的行相同)时间和日期,您可以执行以下操作:

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')

(假设所有记录的时间字段上的日期部分相同;日期/时间的两个字段不符合您的最佳利益,并且在某些情况下使用字段名称的保留字可能适得其反)

它的工作原理是因为子查询仅在您从外部查询感兴趣的记录上进行过滤。

将同一年(日期)&lt; 200和cardto ='VIP'应用于外部查询可以进一步提高性能。