2016-12-19 19 views
1

シンプルな見た目の問題がありますが、どのように処理するのか分かりません。 私は値で記入されたトウの列、またはnullを持っています。分割中にnull値を処理する方法

私はこのように、これらの平均値を作成する必要があります両方の値=(A + B)/ 2

  • 一方がnullの場合、= AまたはB
  • ある場合

    1. その後、別の方法でそれを書くことが可能です:

      case when a is not null and b is not null then.... 
      etc. 
      

      私はシンプル(a+b)/2を使用している場合、私はを取得値のいずれかがnullの場合はとなります。あなたはまた、複雑なcase表現でこれを行うことができます

      select v.avg_ab 
      from t outer apply 
          (select avg(x) as avg_ab 
           from (values (t.A), (t.B) 
            ) v 
          ) v; 
      

      ::これは、ために十分に機能

      select (case when A is not NULL and B is not NULL then (A + B)/2 
            when A is not NULL then A 
            when B is not NULL then B 
           end) as avg_ab 
      . . . 
      

      NULL値を無視avg()avg()ので

    +0

    '合体((A + B)/ 2、B、A)'? – TZHX

    +0

    A、Bの両方がNULLの場合は、どのような値にする必要がありますか? – Stavr00

    +0

    um ...多分私はAVG()http://stackoverflow.com/questions/7367750/average-of-multiple-columnsとマーティンの答えをチェックしています。 – xQbert

    答えて

    3

    は、おそらく最も簡単な方法は、とouter applyを使用することです2値; 3のために実行可能です。それを超えて一般化しません。

    select ((coalesce(A, 0) + coalesce(B, 0))/
         ((case when A is not null then 1 else 0 end) + 
          (case when B is not null then 1 else 0 end) 
         ) 
         ) 
    

    しかしapply方法はまだ簡単です:caseを使用するもう一つの方法は、もう少し一般化です。

    +0

    私はこのOP要求に対してひどい解決策です。 –

    3

    彼らはあなたが(A+A)/2=Aの数学的な「トリック」を使用して、かなりエレガントなファッションで私見をこれを書くために​​3210を使用することができ、null平均を生じるはずである両方nullある場合を想定すると:

    (COALESCE(a, b) + COALESCE(b, a))/2 
    
    +1

    私はいつもCOALESCEを忘れています! –

    +0

    もし私がそれらの4つを持っていたら?それから私は:(a、b、c、d)とすべての変換を使用する必要がありますか?それらのうちの1つがヌルでない場合は、2で1つの値だけを除算します。 – HeadOverFeet

    0

    次のことを試してみてください。

    SELECT (ISNULL(a, b)+ISNULL(b, a))/2 
    
    1

    これは、クリーンなソリューション

    だろう
    select coalesce((A+B)/2,A,B) 
    



    デモ:

    declare @t table (id int,A int,B int) 
    
    insert into @t values (1,30,50),(2,30,null),(3,null,50),(4,null,null) 
    
    select id,A,B,coalesce((A+B)/2,A,B) as result 
    from @t 
    

    +----+------+------+--------+ 
    | id | A | B | result | 
    +----+------+------+--------+ 
    | 1 | 30 | 50 | 40  | 
    +----+------+------+--------+ 
    | 2 | 30 | NULL | 30  | 
    +----+------+------+--------+ 
    | 3 | NULL | 50 | 50  | 
    +----+------+------+--------+ 
    | 4 | NULL | NULL | NULL | 
    +----+------+------+--------+ 
    
    関連する問題