Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有MAX(some+thing)=some+thing的SQL语句_Sql_Ms Access_Group By_Aggregate_Having - Fatal编程技术网

具有MAX(some+thing)=some+thing的SQL语句

具有MAX(some+thing)=some+thing的SQL语句,sql,ms-access,group-by,aggregate,having,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'行 这表示没问题,Access表示没问题 这是我

我在使用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'行

这表示没问题,Access表示没问题

这是我收到的消息:您试图执行的查询没有将指定的表达式“maxtime+date=time+date、cardto='VIP'和cardnr=”作为聚合函数的一部分

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


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

试着这样想——在聚合完成后应用have。 因此,它不能与时间+日期或cardto的未聚合表达式进行比较

但是,要获取最后一个原则,与获取与其他聚合函数(如weel time和date)相关的行相同,您可以执行以下操作:

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')
假设时间字段上的日期部分对于所有记录都是相同的;为日期/时间设置两个字段并不符合您的最佳利益,而且在某些情况下,为字段名使用保留字可能会适得其反

这是因为子查询只对外部查询中您感兴趣的记录进行过滤


应用相同的YearDate如果您将selec更改为选择cardnr、time、date、cardto…?having中的所有内容不应该都在where子句中吗?这是每组的另一个最大问题!见等人。时间和日期是保留字,在我看来,在任何数据库中都不适合作为字段名。谢谢你的回答。我试图理解实际执行聚合函数的时间,感觉它是在分组发生的同时完成的,即使该函数是在HAVING子句中编写的,在HAVING子句中,我已经丢失了行和列。如果我尝试您的查询,它是否会选择那些具有cardto='VIP'的最新行?如果是这样,我意识到这只是一个将cardto=移动到外部查询的问题,以使其执行我需要的操作。至于cardto='VIP',如果您只想选择具有MAXtime+日期且同时是cardto='VIP'的行,请将其移出。至于何时出现最大值、最小值和其他值-是的,您可以说have和GROUP BY同时发生,重要的部分是,当评估WHERE部分时,DB正在“查看记录”,但您还无法知道特定记录的最大值。