按分组的计算字段排序查询
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
子句的 运行 查询之后对结果进行排序,您将收到溢出错误。
在 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
子句的 运行 查询之后对结果进行排序,您将收到溢出错误。