2016-12-28 8 views
1

平均値が必要な2つのデータ列があります。セルの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

あなたが少しでも複雑な式のロジックを必要とするアクセスクエリを構築し、列の多くのペアのためにそのロジックを再利用する必要がされている場合は、カスタムVBA関数を作成するほうが良いでしょう(また、ユーザ定義関数と呼ばれます、またはUDF)を使用してこの作業を行います。あなたの例では、それは難しいことではありません。 SQLビューでクリーンなコード

  • 繰り返しテキスト内気づくのは難しいです誤字
  • 働き者に起因する誤差の可能性の減少、

    • 明確:このアプローチは、最も重要なもののいくつかの利点がありますコードは一度しか表示されないため、パフォーマンスを向上させるために更新するか、別の目的のために変更する必要がある場合は、一箇所で変更する必要があります。

    Excel's = AverageIF Accessには組み込まれていない)、あなたは

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

    あなたはVBAで働いたことがない場合:あなたはこのようなクエリデザイナまたはSQLビューで簡単に再利用することができ、その後

    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 
    

    :ULDの線に沿ってVisual Basicで新しいモジュールを作成します前に、ここでのアクセス2013年にこの簡単な例を設定する手順は、次のとおりです。

    1. 選択データベースツールリボンメニューから、その後、マックの下 ro、 選択Visual Basic。エディター(Microsoft Visual Basic for アプリケーション)が開きます。
    2. [プロジェクト]ペインには、データベース名のノードがあります。そのノードを右クリックし、[挿入]> [モジュール]を選択します。
    3. コードウィンドウには、1,、および/またはOption Explicitのような、1行または2行の自動生成コードが表示されます。表示されているコードの下をクリックし、上記のコードサンプルからPublic Functionで始まるものすべてを入力するか、 を貼り付けます。
    4. Microsoft Visual Basic for Applicationsウィンドウを閉じます。この機能は、クエリデザイナまたはSQLビューで使用できるようになりました。
    5. データベースを閉じるときに、新しいテーブルやクエリと同じように、新しいモジュールを保存して名前を入力するよう求められます。
  • +0

    パーフェクト!ちょうど私が探していたもの。ありがとうございました! – PVic

    +0

    私はそれを保存して関数を実行しようとすると、「未定義関数 'AverageIFNotZero' in Expresion」という警告が表示される理由は分かりますか?私は関数を保存する前に正常に実行されますが、いったん保存されると何らかの理由でこの警告が表示されます。 – PVic

    +0

    VBAまたはクエリのいずれかで意図的に関数名のスペルを間違えない限り、そのエラーを再現できません。それらが一致する限り(大文字と小文字は区別されません)、データベースを保存してから再度開いても、うまく動作するようです。保存しても問題が解決しない場合は、使用しているAccessのバージョンと、UDFが使用しているモジュールとUDFが使用しているモジュールの名前について詳しく説明してください。 – Mat

    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 
    
    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のみを必要とします他のフィールドのコピー貼り付け時に元のコードの5倍に2回置き換えられます。