在MS Access 2010数据库中,我试图设计一个查询,该查询将返回按两个分组字段之和的比率排序的结果。但是到目前为止,我的尝试导致了立即的溢出错误,甚至在查询没有机会尝试运行之前。如何修复下面的代码,以便我的结果查询产生按计算字段排序的结果?
这是表结构:
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;
根据@TonyStark的评论,我尝试更改ORDER BY ROUND( (SUM([Table2].[SUBSET]) / SUM([Table2].[TOT]) ) , 4) DESC;
为ORDER BY 4 DESC;
,但是此更改仍然会导致溢出错误。我可以运行查询的唯一方法是ORDER BY
完全删除该子句,这违背了此问题的目的。
我尝试了EvDev答案中建议的代码,但他的代码也仍然会导致相同的溢出错误。每个表中可能有2000行,尽管其中一个表有250个字段。数据类型是NAME的文本,SUBSET,TOT和ID的数字。
从评论/故障排除中写出答案:
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
子句的查询之后尝试对结果进行排序,那么您将收到溢出错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句