不能通过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)'作为聚合函数的一部分。

有什么问题?

谢谢

不能通过c#运行MS Access查询

对于几乎所有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查询中计算它。