首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在除法时处理空值

如何在除法时处理空值
EN

Stack Overflow用户
提问于 2016-12-19 14:14:26
回答 4查看 1.2K关注 0票数 1

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

我得做这样的平均数:

  1. 如果两者都包含值= (A+B)/2
  2. 如果一个是空的,那么=A或B。

那么,是否有可能以不同的方式编写:

代码语言:javascript
复制
 case when a is not null and b is not null then....
 etc.

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-12-19 14:16:53

可能最简单的方法是将outer applyavg()一起使用,因为avg()忽略了NULL值:

代码语言:javascript
复制
select v.avg_ab
from t outer apply
     (select avg(x) as avg_ab
      from (values (t.A), (t.B)
           ) v
     ) v;

您还可以使用一个复杂的case表达式来完成这一任务:

代码语言:javascript
复制
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的方法是更通用的:

代码语言:javascript
复制
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方法仍然更简单。

票数 4
EN

Stack Overflow用户

发布于 2016-12-19 14:17:25

假设两者都是null时会产生null平均值,那么您可以使用(A+A)/2=A的数学“技巧”,并使用coalesce以相当优雅的方式(IMHO)编写这篇文章:

代码语言:javascript
复制
(COALESCE(a, b) + COALESCE(b, a)) / 2
票数 3
EN

Stack Overflow用户

发布于 2016-12-19 14:25:28

这将是最干净的解决方案

代码语言:javascript
复制
select  coalesce((A+B)/2,A,B)   

演示:

代码语言:javascript
复制
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
代码语言:javascript
复制
+----+------+------+--------+
| id | A    | B    | result |
+----+------+------+--------+
| 1  | 30   | 50   | 40     |
+----+------+------+--------+
| 2  | 30   | NULL | 30     |
+----+------+------+--------+
| 3  | NULL | 50   | 50     |
+----+------+------+--------+
| 4  | NULL | NULL | NULL   |
+----+------+------+--------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41224511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档