我在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子句,为什么它会返回此错误?
答案 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;为您提供每个用户所需范围内的成绩数。