我有两列数据需要平均OR,如果其中一个单元格为零,则只需取非零值。
SELECT ID, IIF((A+B)=A, A, IIF((A+B)=B, B, (A+B)/2)) AS AVE_AB <br/>
FROM Data;
有没有办法让这段代码更有效率?我有另外25个变量可以做到这一点,并希望尽可能使我的代码更有效和更短。
答案 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)做这项工作。举个例子,这并不难;这种方法有几个优点,其中最重要的是:
按照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中设置此简单示例:
Option Compare Database
和/或Option Explicit
。单击您看到的代码下方,然后键入或粘贴
上面的代码示例中的所有内容都以Public Function
开头。 答案 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