2016-12-28 119 views
1

我有两列数据,如果其中一个单元格的值为零,则需要平均值,然后取非零值。MS访问平均值或求和值

SELECT ID, IIF((A+B)=A, A, IIF((A+B)=B, B, (A+B)/2)) AS AVE_AB <br/> 
FROM Data; 

有没有办法让这段代码更有效率?我还有另外25个变量可以做到这一点,并希望尽可能使我的代码更高效,更短。

+0

什么版本的Access? – BJones

回答

1

如果你正在建立一个Access查询,需要稍微复杂的表达逻辑,并有重用逻辑许多列对,你是最好创建一个自定义VBA函数(也称为用户定义的函数,或UDF)来完成这项工作。举例来说,这并不难;这种方法有几个优点,其中最重要的是:

  • 更清晰,在SQL视图更清晰的代码
  • 错误的原因在于难以重复的文字
  • 主力中发现错别字
  • 的可能性减小代码只出现一次,所以如果你想更新它的性能或修改它的目的不同,你只需要在一个地方进行更改

以下示例的Excel的= AverageIF()函数(哪些访问没有内置),你co ULD创建在Visual Basic中的线沿线的一个新的模块:

Public Function AverageIFNotZero(columnA, columnB) 

    If columnA = 0 Then 
     AverageIFNotZero = columnB 
    Else 
     If columnB = 0 Then 
      AverageIFNotZero = columnA 
     Else 
      AverageIFNotZero = (columnA + columnB)/2 
     End If 
    End If 

End Function 

然后,你可以在查询设计器或SQL视图这样容易重用:

SELECT ID, AverageIFNotZero(A,B) AS AVE_AB, AverageIFNotZero(C,D) AS AVE_CD FROM Data; 

如果你从未使用VBA工作之前,这里是设置这个简单的例子了在Access 2013中的步骤:苹果从功能区菜单

  1. 选择数据库工具,然后下ro, select Visual Basic。编辑器(Microsoft Visual Basic为 应用程序)将打开。
  2. 在“项目”窗格中,将会有一个包含数据库名称的节点。右键单击该节点并选择“插入”>“模块”。
  3. 代码窗口将显示一行或两行自动生成的代码,如:Option Compare Database和/或Option Explicit。单击您看到的代码下方,然后键入或粘贴 上面以Public Function开头的代码示例中的所有内容。
  4. 关闭Microsoft Visual Basic for Applications窗口。该功能现在应该可用于查询设计器或SQL视图。
  5. 关闭数据库时,系统会要求您保存新模块,并为其提供一个名称,就像新建表或查询一样。
+0

完美!正是我在找的东西。谢谢! – PVic

+0

你知道为什么我保存后,尝试运行该函数,它给了我一个警告,说:“未定义函数'AverageIFNotZero'在Expresion”?在我保存该功能之前它运行良好,但一旦保存,我出于某种原因得到此警报。 – PVic

+0

除非我故意拼错VBA或查询中的函数名称,否则我无法重现该错误。只要它们匹配(它甚至不区分大小写),即使在我保存并重新打开数据库后,它似乎仍然适用于我。如果保存后仍然有问题,请提供一些关于您正在使用的Access版本的更多详细信息,以及您用于UDF和UDF所在模块的确切名称。然后,我可以再看一看。 – Mat

0

A SWITCH功能可能会帮助你。它更简洁一些,但有很多逻辑可以通过它,可能不会更容易输入。你可以find more info here

SELECT ID, 
     SWITCH(A+B=A,A, 
       A+B=B,B, 
       1=1,(A+B)/2) AS AVE_AB 
FROM Data 
1

这个怎么样?

SELECT ID, IIF ((A*B) = 0, abs(A-B), (A+B)/2)) as AVE_AB 
FROM Data; 
1

使用SGN

SELECT ID, (A + B)/(Sgn(A) + Sgn(B)) AS AVE_AB 
FROM Data; 

如果A和/或B可以是负的,适用阿布斯

SELECT ID, (A + B)/(Abs(Sgn(A)) + Abs(Sgn(B))) AS AVE_AB 
FROM Data; 

这并不短,但A和B只需要当您复制粘贴其他字段时,将被替换两次,与您原始代码中的五次相反。