不能通过c#运行MS Access查询
本文关键字:MS Access 查询 运行 不能 | 更新日期: 2023-09-27 18:02:57
我在MS Access中运行得很好!
SELECT
BK_LEVEL9.Aitur AS Aitur,
Sum(BK_LEVEL9.M_NewQty) AS M_NewQty,
Sum(BK_LEVEL9.ErrorCount) AS ErrorCount,
(IIf([M_NewQty]<>0,Round(([ErrorCount]*100)/[M_NewQty],2),0)) AS ErrorProcc
FROM
BK_LEVEL9
GROUP BY
BK_LEVEL9.Aitur;
在我的c#程序中,我尝试这样运行这个查询:
SQL = "SELECT Aitur,M_NewQty,ErrorCount,ErrorProcc from MyQUERY";
dsWorkKabat = new DataSet();
adp = new OleDbDataAdapter(SQL, Conn);
adp.Fill(dsWorkKabat, "MyQUERY");
adp.Dispose();
,我得到了这个错误:
你试图执行一个不包含指定表达式的查询'IIf(not [M_NewQty]=0,Round([ErrorCount]*100/[M_NewQty],2),0)'作为聚合函数的一部分。
有什么问题?
谢谢
对于几乎所有DBMS (MySQL是我所知道的唯一例外,但可能还有其他例外),SELECT中未聚合的每个列都需要在GROUP BY子句中。在您的查询的情况下,您需要像这样分组:
GROUP BY
BK_LEVEL9.Aitur, IIf([M_NewQty]<>0,Round(([ErrorCount]*100)/[M_NewQty],2),0);
进行一些测试,似乎access计算前三列(按查询分组),而不是使用别名计算ErrorProcc。
注意,因为以色列祭坛的建议不工作,如果BK_LEVEL9。Aitur不是主键(我很确定不是,否则MyQuery查询不需要Group by子句)。
为什么它不起作用?Access在执行求和之前计算Group by,因此IIf的Group by基于BK_LEVEL9。M_NewQty和BK_LEVEL9。ErrorCount,而不是别名
解决方案是什么?可能最简单的方法是从MyQuery中删除IIf,然后在ADO查询中计算它。