我有两列数据,如果其中一个单元格的值为零,则需要平均值,然后取非零值。MS访问平均值或求和值
SELECT ID, IIF((A+B)=A, A, IIF((A+B)=B, B, (A+B)/2)) AS AVE_AB <br/>
FROM Data;
有没有办法让这段代码更有效率?我还有另外25个变量可以做到这一点,并希望尽可能使我的代码更高效,更短。
我有两列数据,如果其中一个单元格的值为零,则需要平均值,然后取非零值。MS访问平均值或求和值
SELECT ID, IIF((A+B)=A, A, IIF((A+B)=B, B, (A+B)/2)) AS AVE_AB <br/>
FROM Data;
有没有办法让这段代码更有效率?我还有另外25个变量可以做到这一点,并希望尽可能使我的代码更高效,更短。
如果你正在建立一个Access查询,需要稍微复杂的表达逻辑,并有重用逻辑许多列对,你是最好创建一个自定义VBA函数(也称为用户定义的函数,或UDF)来完成这项工作。举例来说,这并不难;这种方法有几个优点,其中最重要的是:
以下示例的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中的步骤:苹果从功能区菜单
Option Compare Database
和/或Option Explicit
。单击您看到的代码下方,然后键入或粘贴 上面以Public Function
开头的代码示例中的所有内容。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
这个怎么样?
SELECT ID, IIF ((A*B) = 0, abs(A-B), (A+B)/2)) as AVE_AB
FROM Data;
使用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只需要当您复制粘贴其他字段时,将被替换两次,与您原始代码中的五次相反。
什么版本的Access? – BJones