MS Access Average或Sum

时间:2016-12-28 22:22:00

标签: sql ms-access

我有两列数据需要平均OR,如果其中一个单元格为零,则只需取非零值。

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

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

4 个答案:

答案 0 :(得分:1)

这个怎么样?

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

答案 1 :(得分:1)

如果要构建甚至需要稍微复杂的表达式逻辑的Access Query,并且必须将该逻辑重用于多对列,那么最好创建自定义VBA函数(也称为用户定义函数或UDF)做这项工作。举个例子,这并不难;这种方法有几个优点,其中最重要的是:

  • SQL View中更清晰,更清晰的代码
  • 在重复文本中难以注意到由于拼写错误而导致错误的可能性降低
  • 主力代码只出现一次,因此如果您想更新性能或为了不同的目的进行修改,您只需要在一个地方进行更改

按照Excel的= AverageIF()函数(Access没有内置函数)的示例,您可以在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

然后,您可以在Query Designer或SQL View中轻松地重复使用它,如下所示:

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

如果您之前从未使用过VBA,请按照以下步骤在Access 2013中设置此简单示例:

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

答案 2 :(得分:1)

使用 Sgn

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

如果A和/或B可以为负数,请应用 Abs

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

它不短,但A和B只需要更换两次,而不是原始代码中的五倍,当您复制粘贴其他字段时。

答案 3 :(得分:0)

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