2012-05-21 43 views
1

我在Access中创建了一个带有子查询的查询,并且无法在Excel 2003中链接它:当我使用菜单DataImport External DataImport Data...并选择mdb文件时,查询是不在列表中。如果我使用菜单Data - >Import External Data - >New Database Query...,我可以在列表中看到我的查询,但在导入向导结束时,我得到这个错误:无法链接MS Access查询与子查询

Too few parameters. Expected 2. 

我的猜测是,查询语法导致问题,实际上查询包含一个子查询。所以,我会尝试描述查询目标和结果语法。

表位置

  • ID(自动编号,主键)
  • 位置(双)
  • currency_id(长)(引用Currency.ID)
  • 图集(长)

表货币

  • ID(自动编号,主键)
  • 码(文本)

查询目标

  • 加入2代表由图集= 1
  • 过滤
  • 在(“A”,“B”)中通过currency.code筛选
  • 组按币种并计算位置的总和为每种货币组的呼叫的结果:sumOfPositions
  • 计算ABS各币种组
  • (sumOfPositions)计算前一结果的总和作为单个结果

查询

没有最后一笔查询可以使用设计视图中创建。生成的SQL是:

SELECT Currency.code, Sum(Positions.position) AS SumOfposition 
FROM [Currency] INNER JOIN Positions ON Currency.ID = Positions.currency_id 
WHERE (((Positions.portfolio)=1)) 
GROUP BY Currency.code 
HAVING (((Currency.code) In ("A","B"))); 

,以计算最终SUM我做了以下(在SQL视图):

SELECT Sum(Abs([temp].[SumOfposition])) AS sumAbs 
FROM [SELECT Currency.code, Sum(Positions.position) AS SumOfposition 
FROM [Currency] INNER JOIN Positions ON Currency.ID = Positions.currency_id 
WHERE (((Positions.portfolio)=1)) 
GROUP BY Currency.code 
HAVING (((Currency.code) In ("A","B")))]. AS temp; 

所以,问题是:是否有用于构建一个更好的办法该查询为了使出口工作?

回答

0

我已经解决了我的问题,因为外部查询正在做一个微不足道的事实。当在Excel中选择New Database Query...,在过程结束时,按Finish后,一个Import Data形式弹出,询问

Where do you want to put the data?

您可以点击Create a PivotTable report...。如果您正确定义数据透视表,Excel将只显示外部总和。

1

我看不出有太多错误,但我会拿出一些垃圾接入技术,在和缩小查询到这一点,这应该可以正常运行:

SELECT Sum(Abs(A.SumOfPosition)) As SumAbs 
FROM (SELECT C.code, Sum(P.position) AS SumOfposition 
     FROM Currency As C INNER JOIN Positions As P ON C.ID = P.currency_id 
     WHERE P.portfolio=1 
     GROUP BY C.code 
     HAVING C.code In ("A","B")) As A 
+0

谢谢,这就是我所做的。之后,Access确实添加了垃圾内容。无论如何,这个查询不能导出到excel。 – perissf

+0

我想我必须使用Excel Pivot Table功能,它将内部查询的查询结果放到一个支持最终总和的Pivot中。 – perissf

0

它可能值得尝试在MS Access查询定义中声明您的参数并定义它们的数据类型。当您尝试在MS Access本身之外使用查询时,这一点尤其重要,因为它无法自动检测参数类型。这种方法有时会遇到或错过,但值得一试。

PARAMETERS [[Positions].[portfolio]] Long, [[Currency].[code]] Text (255); 
SELECT Sum(Abs([temp].[SumOfposition])) AS sumAbs 
FROM [SELECT Currency.code, Sum(Positions.position) AS SumOfposition 
FROM [Currency] INNER JOIN Positions ON Currency.ID = Positions.currency_id 
WHERE (((Positions.portfolio)=1)) 
GROUP BY Currency.code 
HAVING (((Currency.code) In ("A","B")))]. AS temp; 
+0

对不起,我无法使它工作。 – perissf