2016-05-13 59 views
1

我在MS Access中拥有下表。选择最接近给定值的两行

Day ABC 
 
365  25 
 
548  35 
 
730  37 
 
913  58 
 
1095 146

我想查询它这样,我之前和列日的给定值后得到的行。这个值是可变的,可以是例如value = 432 对于此示例,查询将生成下表。

Day ABC 
 
365  25 
 
548  35

因为给定值= 432比548的

日值我能够做到的就是让一个场超过365天值较大和较小的,但不是两个。以下查询为我提供了Day字段的正确行。

Select Max(Day) As Day From Table Where Day < 432 
    UNION 
    Select Min(Day) As Day From Table Where Day > 432 

当我使用此代码并添加另一个字段,如ABC我得到一个错误。

您试图执行一个查询,该查询不包含指定的 表达式'ABC'作为聚合函数的一部分。

你能帮帮我吗?我认为这应该是一个非常简单的任务。谢谢!

回答

1

你的SQL有几个问题。由于您没有将GROUP BY ABC子句添加到两个SELECT语句中,因此会出现错误消息。
由于MAX(DAY) as DAY,您还会得到一个循环参考 - 您需要将as Day更改为as lDay
你可能会(我)得到一个错误语法错误调用它Table - 很确定这是一个保留字。

也许这查询将更好的工作:

Select Top 1 Day, ABC From Table3 Where Day <= 913 ORDER BY Day Desc 
UNION ALL 
Select Top 1 Day, ABC From Table3 Where Day >= 913 ORDER BY Day Asc 
+0

嗨,谢谢你的答案!但是,这总是会给我表格的第一行(不管值)和其他行。对于745的值,我想获得730和913行,而不是365和其他行 – jonas778

+0

你绝对正确 - 我的歉意。将'ORDER BY Day Desc'添加到第一个'SELECT'语句的末尾和'ORDER BY Day Asc'到第二个语句的末尾。另外,如果你选择一个确切的值;说913它会返回一个值,因为'UNION'自动删除重复项,返回两行(这两个都是相同的)使用'UNION ALL'。我会更新我的答案以显示Asc和Desc排序。 –

+0

该错误与单词Table没有任何关系,我只是用它来说明这个例子。实际的表格命名不同 – jonas778

0

你也可以是一个小票友:

Select Top 2 Day, ABC From Table3 Order By Abs(Day - 432) Desc 

注意请,那结果将匹配问题的标题,不必然你的详细解释...