5

我在 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 子句,那么为什么它会返回此错误?

4

3 回答 3

10

来自 Allen Browne 出色的访问技巧网站:Surviving Subqueries

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

您花了半个小时用子查询构建了一个查询,并验证了它是否正常工作。您根据查询创建报告,但它立即失败。为什么?

问题出在 Access 在后台响应报表的排序和分组或聚合时所做的工作。如果它必须为报告聚合数据,那就是不允许的“多级”分组。

解决方案

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

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

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

    从查询 1 中选择 *;

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

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

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

许可 您可以出于任何目的(个人、教育、商业、转售......)自由使用这些文章和示例数据库中的任何内容(代码、表单、算法......)。我们所要求的只是您在代码中承认该网站,并带有以下注释:“来源:http ://allenbrowne.com ”改编自:http ://allenbrowne.com

于 2012-04-23T20:15:13.190 回答
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

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

于 2012-04-23T16:55:43.057 回答
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 
   ...

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

于 2012-04-24T08:18:16.837 回答