1

単純に見える問題がありますが、処理方法がわかりません。値または で埋められた 2 つの列がありますnull

これらの平均を次のように作成する必要があります。

  1. 両方に値がある場合 = (A+B)/2
  2. いずれかが null の場合 = A または B。

それを別の方法で書くことは可能ですか:

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

シンプルを使用すると、値の 1 つが の場合(a+b)/2に得られます。nullnull

4

4 に答える 4

4

おそらく最も簡単な方法は、値を無視するのでouter applywithを使用することです。avg()avg()NULL

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

複雑なcase式でこれを行うこともできます。

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
. . .

これは 2 つの値に対して十分に機能します。3 については実行可能です。それ以上は一般化できません。別の使用方法caseは、もう少し一般化できます。

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方法はまだ簡単です。

于 2016-12-19T14:16:53.350 に答える
3

null両方が平均になる場合を想定するとnull、数学的な「トリック」を(A+A)/2=A使用coalesceして、非常にエレガントな方法でこれを記述することができます。

(COALESCE(a, b) + COALESCE(b, a)) / 2
于 2016-12-19T14:17:25.573 に答える
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   |
+----+------+------+--------+
于 2016-12-19T14:25:28.903 に答える
0

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

SELECT (ISNULL(a, b)+ISNULL(b, a))/2
于 2016-12-19T14:18:42.040 に答える