2017-07-11 52 views
0

我创建了一个MS Access数据库,用于跟踪工作中的一些项目。用户输入数据,然后在查询中汇总(使用计数或总和)来计算每个区域的实际值,使用UNION加入,然后与该区域的目标进行比较。我尝试输入一个IIF声明来有条件地计算[Act]/[Goal]的百分比,如果[Act]为空,则该值为零,如果[Act]大于[Goal],则该值为1,因此没有超过100%的值。问题在于它大部分时间都在工作,但是其他时间会失败,并且没有明显的逻辑错误或原因,我可以弄清楚。访问计算不一致或正确计算:“大于”在IIF声明

有时,即使看着它,也不能说[法]> [目标],这很明显。数字都是整数,没有什么疯狂的或格式化的差异。 [Met]中的公式就是我希望达到的。我添加了[TEST]字段来追溯它可能不工作的地方,这表明Access并不总是返回[Act]> [Goal]的正确答案。

我的查询: screen

出来的东西(只折断):

screen

正如你所看到的,它可以正确处理最行,但后来认为149是少比52小,128小于3.因此,它产生[Met]值超过100%。

有没有人有过这种情况发生之前或有任何建议?我已经尝试使用刷新,点击单元格来打入输入,我能想到的所有东西。

+0

它不会让我编辑(不够分,其中包含的照片? ) [Met]的完整公式是: Met:IIf(IsNull([Act]),0,IIf([Act]> [Goal],1,Round([Act]/[Goal],2)) ) [TEST]的完整公式为: TEST:IIf([Act]> [Goal],“greater”,“less than”) –

+0

查询结果窗口中有一个很好的线索:文本值左对齐而数字值是右对齐的。 – Minty

回答

1

我认为,虽然你的列是Ints,但它们正在被转换为变量(或至少一个变量)中的字符串。

如果你看看数据,你会看到如果你比较它们,测试的结果对于字符串比较是正确的。

E.g. “3”>“128”(因为第一个字符的char值更高)。

在您的查询,请与周围的瓦尔()的变量,当你对它们进行比较,如下:

IIf(IsNull([Act]),0,IIf(Val([Act])>Val([Goal]),1,Round([Act]/[Goal],2)‌​))

+0

谢谢!我想知道是否这样的事情是基于某人在另一个程序中遇到的问题,但不知道如何测试。这固定一切:)明确解释它的奖金点,但仍然友好。 –

+0

很高兴帮助:) – Steveland83

+1

问题的根源在于,联合查询通常会为数字返回字符串。你不透露你的查询,但阅读[这里](https://stackoverflow.com/questions/44910348/access-sql-appears-to-be-treating-date-as-dd-mm-yyyy/44921592 #44921592)。 – Gustav