子查询中不允许使用多级GROUP BY子句

Inv*_*tax 4 sql ms-access

我在MS Access中有如下查询

SELECT tblUsers.Forename, tblUsers.Surname, 
  (SELECT COUNT(ID) 
     FROM tblGrades 
     WHERE UserID = tblUsers.UserID 
     AND (Grade = 'A' OR Grade = 'B' OR Grade = 'C')) AS TotalGrades
FROM tblUsers
Run Code Online (Sandbox Code Playgroud)

我把它放到报告中,现在当试图查看报告时,它会显示一条警告" 子查询中不允许使用多级GROUP BY子句 "

我没有得到的是我在查询中甚至没有任何GROUP BY子句,为什么它会返回此错误?

mwo*_*e02 9

来自Allen Browne的优秀网站访问提示:生存子查询

错误:"不允许多级别组"

您花了半个小时使用子查询构建查询,并验证它是否全部有效.您可以根据查询创建报告,并立即失败.为什么?

问题源于Access在响应报告的排序和分组或聚合时在幕后所做的事情.如果它必须聚合报告的数据,那就是不允许的"多级"分组.

解决方案

  • 在报表设计中,从"排序和分组"对话框中删除所有内容,并且不要尝试在"报表页眉"或"报表页脚"中对任何内容求和.(在大多数情况下,这不是一个实用的解决方案.)

  • 在查询设计中,取消选中子查询下的"显示"框.(仅当您不需要在报告中显示子查询的结果时,此解决方案才是实用的.)

  • 创建一个处理子查询的单独查询.将此查询用作报表所基于的查询的源"表".有时(并非总是)将子查询移动到较低级别的查询可以避免该问题,即使第二个查询非常简单

    SELECT*FROM Query1;

  • 使用域聚合函数(如DSum()而不是子查询).虽然这对于小型表来说很好,但对于大型表来说,性能将无法使用.

  • 如果没有其他工作,请创建一个临时表来保存报告的数据.您可以将查询转换为附加查询(在查询设计中追加查询菜单)以填充临时表,然后将报表基于临时表.

重要说明:我在此处重新发布信息,因为我相信Allen Browne明确允许它.从他的网站:

权限 您可以出于任何目的(个人,教育,商业,转售......)自由使用这些文章和样本数据库中的任何内容(代码,表格,算法......).我们要求的是,您在代码中承认此网站的评论如下:'来源:http://allenbrowne.com '改编自:http://allenbrowne.com