DIVIDING时如何处理空值

时间:2016-12-19 14:14:27

标签: sql select null sql-server-2014 ssms-2014

我有一个简单的问题,但我不知道如何处理。 我有两列填充值或null

我必须这样做的平均值如下:

  1. 如果两者都是值=(A + B)/ 2
  2. 如果一个为null,则= A或B.
  3. 是否可以用不同的方式编写它:

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

    如果我使用简单的(a+b)/2,则在其中一个值为null的情况下,我会获得null

4 个答案:

答案 0 :(得分:3)

可能最简单的方法是将outer applyavg()一起使用,因为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方法仍然比较简单。

答案 1 :(得分:3)

假设两个null同时导致null平均值的情况,您可以使用(A+A)/2=A的数学“技巧”并使用coalesce来写这个以非常优雅的方式,恕我直言:

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

答案 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   |
+----+------+------+--------+

答案 3 :(得分:0)

尝试以下方法:

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