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

时间:2012-04-23 16:27:17

标签: 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

我已将此放入报告中,现在在尝试查看报告时会显示警告“子查询中不允许使用多级GROUP BY子句

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

3 个答案:

答案 0 :(得分:9)

来自Allen Browne优秀的访问提示网站:Surviving Subqueries

错误:“不允许多级别组”

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

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

<强>解决方案

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

  • 在查询设计中,取消选中子查询下的“显示”框。 (只有在您不需要在报告中显示子查询的结果时,此解决方案才可行。)

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

    一样简单

    SELECT * FROM Query1;

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

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

重要提示:我在此重新发布信息,因为我相信Allen Browne明确允许这样做。来自他的网站:

  

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

答案 1 :(得分:3)

试试这个版本:

SELECT users.Forename, users.Surname, grades.TotalGrades
FROM tblUsers AS users
LEFT JOIN (SELECT COUNT(ID) as TotalGrades, UserID FROM tblGrades WHERE (Grade = 'A' OR Grade = 'B' OR Grade = 'C') group by userid) AS grades on grades.UserID = users.UserID

我还没有测试过。查询本身应该没问题,但我不确定它是否在报表数据源中有效。

答案 2 :(得分:0)

试试这个:

SELECT users.Forename, users.Surname, count(grades.id) AS TotalGrades
FROM tblUsers AS users
INNER JOIN tblGrades AS grades ON users.ID=grades.UserID
WHERE grades.Grade in ("A","B","C") group by users.ID;

这是一个简单的连接表。基本上它意味着。选择用户具有“A”或“B”或“C”等级的所有情况(这将为您提供如下表格:

   user1 | A 
   user1 | B 
   user1 | A 
   user2 | A 
   ...

然后它按用户分组,计算成绩出现的次数 - &gt;为您提供每个用户所需范围内的成绩数。