2016-09-21 154 views
0

在MS Access我有表EVO可变VT每人每月国家:子查询提供了错误的参数无效运作

EVO:
国家,月,VT
阿富汗, 1,20
阿富汗2,2 25
阿富汗3,15
乌克兰1,10
乌克兰2,440
乌克兰3,50

我试着计算变量vt的月变化。每个国家。

SELECT b.ctryname_nl, b.mth, b.vt, 
    (SELECT Top 1 a.vt 
    FROM evo a 
    WHERE a.mth > b.mth and a.ctryname_nl = b.ctryname_nl 
    ORDER BY a.ctryname_nl, a.mth) AS Nextvt, 
    Nextvt-vt AS change 
FROM evo b 

为什么Access会给函数提供错误无效参数?

+0

如果你考虑'SELECT * FROM evo b',就很明显'Nextvt'不在范围内(如果你假定从左到右的属性创建顺序,那么你错了)。查看@Gordon Linoff的答案,他使用子查询来创建一个额外的范围级别,以便现在可以使用'SELECT Nextvt from e'。 – onedaywhen

回答

3

您不允许在同一个SELECT的表达式中使用列别名。

只需使用一个子查询:

SELECT e.*, (Nextvt - vt) AS change 
FROM (SELECT b.ctryname_nl, b.mth, b.vt, 
      (SELECT Top 1 a.vt 
       FROM evo as a 
       WHERE a.mth > b.mth and a.ctryname_nl = b.ctryname_nl 
       ORDER BY a.ctryname_nl, a.mth 
      ) AS Nextvt 
     FROM evo as b 
    ) e; 
0

我认为这个问题(或者说另外一个问题)是这样的:

WHERE a.mth > b.mth and a.ctryname_nl = b.ctryname_nl

b是不是你的子查询中定义。

子查询本身就是一个有效的查询。 ()中的任何内容都必须作为独立查询来工作;这是解决子查询问题的好方法。