按分组的计算字段排序查询

ordering query by grouped, calculated field

MS Access 2010 数据库中,我试图设计一个查询,该查询将 return 结果按两个分组字段之和的比率排序。但到目前为止,我的尝试导致立即溢出错误,甚至在查询有机会尝试 运行ning 之前。 如何修复下面的代码,以便我的结果查询生成按计算字段排序的结果?

这是 table 结构:

Table1
    ID
    NAME

Table2
    ID
    SUBSET
    TOT

这里是导致溢出对话框的查询:

SELECT [Table1].[NAME], SUM([Table2].[SUBSET]) As SubsetDays, 
    SUM([Table2].[TOT]) As TotalDays,
    ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) As SubsetPercent 
  FROM [Table2] INNER JOIN [Table1] ON [Table2].ID = [Table1].ID 
  GROUP BY [Table1].[NAME] 
  ORDER BY ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) DESC;

编辑#1

根据@TonyStark 的评论,我尝试将 ORDER BY ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) DESC; 更改为 ORDER BY 4 DESC;,但此更改仍然会导致溢出错误。我可以查询 运行 的唯一方法是完全删除 ORDER BY 子句,这违背了这个问题的目的。


编辑#2

我尝试了 EvDev 的回答中建议的代码,但他的代码仍然导致同样的溢出错误。每个 table 中可能有 2000 行,尽管其中一个 table 有 250 个字段。数据类型是 NAME 的文本和 SUBSET、TOT 和 ID 的数字。

我能够 运行 按原样处理您的代码,因此您的问题可能是记录量过大或与数据类型有关。无论哪种方式,我都使用可能有效的子查询创建了您代码的其他版本。

SELECT * from 

(select [Table1].[NAME], SUM([Table2].[SUBSET]) As SubsetDays, 
SUM([Table2].[TOT]) As TotalDays,
ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) As SubsetPercent 
FROM [Table2] INNER JOIN [Table1] ON [Table2].ID = [Table1].ID 
GROUP BY [Table1].[NAME] ) 

order by SubsetPercent DESC

正在写来自comments/troubleshooting的答案:

Access 中的溢出通常是由被零除错误引起的。在您的查询中:

SELECT [Table1].[NAME], SUM([Table2].[SUBSET]) As SubsetDays, 
    SUM([Table2].[TOT]) As TotalDays,
    ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) As SubsetPercent 
  FROM [Table2] INNER JOIN [Table1] ON [Table2].ID = [Table1].ID 
  GROUP BY [Table1].[NAME] 
  ORDER BY ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) DESC;

你两次除以 SUM([Table2].TOT)。一次在 SELECT 子句中,一次在 ORDER BY 子句中。

您可以调整这些公式以在除法之前在分母中查找 0 以避免溢出错误。类似于:

iif(SUM([Table2].[TOT])=0, <some constant value>, ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4))

当您删除 ORDER BY 子句时它没有抛出错误的原因是因为 Access 不会计算每条记录的结果,除非它需要显示,或者 ORDER BY 或其他一些预聚合类型逻辑。如果您尝试在没有 ORDER BY 子句的 运行 查询之后对结果进行排序,您将收到溢出错误。