在 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的编号。
答案 0 :(得分:1)
撰写评论/疑难解答的答案:
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
子句的查询后尝试对结果进行排序,则会收到溢出错误。
答案 1 :(得分:0)
我能够按原样运行您的代码,因此您的问题可能是大量的记录或与数据类型有关。无论哪种方式,我使用可能有效的子查询创建了其他版本的代码。
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