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

时间:2015-03-25 19:38:38

标签: sql ms-access ms-access-2010

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;

修改#1

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


修改#2

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

2 个答案:

答案 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