我有兩列數據,如果其中一個單元格的值爲零,則需要平均值,然後取非零值。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