在计算字段上使用 GROUPBY 的子查询:您的查询不包括指定的表达式“”作为聚合函数的一部分

Subquery with GROUPBY on calculated field: Your query does not include the specified expression '' as part of an aggregate function

我收到以下错误消息

"Your query does not include the specified expression 'SampleCode' as part of an aggregate function."

我研究了聚合函数并尝试了各种方法来使用构成代码的各个数据字段进行 GROUP BY,但我似乎无法使任何工作正常进行。

'SampleCode' 是一个串联查询字段(查询名称:datqry_SampleNumber),它基于来自 3 个不同表的数据创建一个唯一值,如下所示...

SampleCode: IIf([tbl_Carcass.SampleNumber]="-999","-999",
    "NPT-" & [tbl_SurveyInfo.SurveyYear*] & "-" & 
    [datqry_TransectData.Project_Code] & "-" & [tbl_Carcass.SampleNumber])

对于 SampleNumber 值 > 0001(-999 是一个占位符,表示没有分配 SampleNumber)。请注意,SurveyYear* 是一个基于 SurveyDate 数据字段的计算字段。

因此,由于 SampleCode 对于每个样本都必须是唯一的,我正在尝试基于上述查询构建一个重复查询,以识别重复的 SampleCode,以便可以使用唯一限定符重新标记和存档它们。重复查询操作的条件如下

In (SELECT [SampleCode] FROM [datqry_SampleNumber] As Tmp 
    GROUP BY [SampleCode] HAVING Count(*)>1 )

关于如何解决这个问题有什么想法吗?预先感谢您的帮助和建议。

这看起来可能是 Access 用来解释其 SQL 的 JET 引擎的限制。

使用 subquery 似乎有问题,因为它包含计算字段的聚合(在您的情况下为 SampleCode)。

尝试将其另存为单独的查询,例如qryDuplicates:

SELECT [SampleCode] FROM [datqry_SampleNumber] 
    GROUP BY [SampleCode] HAVING Count(*)>1;

那么您正在尝试做的事情将按预期工作:

SELECT * from someTable WHERE someField IN (
    SELECT * FROM qryDuplicates
);


技术说明:我已经对其进行了测试,它确实特定于 SampleCode 是一个计算字段这一事实。当未计算相关字段时,执行完全相同类型的分组子查询会按预期工作。

使用 this test database 此查询有效:

SELECT * FROM Table2 WHERE Field3 IN (
    SELECT Field1 FROM datqry_SampleNumber 
    GROUP BY Field1 HAVING COUNT(*) > 1
);

而这不是

SELECT * FROM Table2 WHERE Field3 IN (
    SELECT SampleCode FROM datqry_SampleNumber
    GROUP BY SampleCode HAVING COUNT(*) > 1
);