2016-12-28 121 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只需要當您複製粘貼其他字段時,將被替換兩次,與您原始代碼中的五次相反。