我有一个简单的问题,但我不知道如何处理。 我有两列填充值或null
。如何处理空值而分割
我必须作出这样的平均的这些:
- 如果在两者的值=(A + B)/ 2
- 如果一个是空值,则= A或B.
是否有可能把它写在随后不同的方式:
case when a is not null and b is not null then....
etc.
如果我用一个简单(a+b)/2
我得到null
其中一个值为null
。
我有一个简单的问题,但我不知道如何处理。 我有两列填充值或null
。如何处理空值而分割
我必须作出这样的平均的这些:
是否有可能把它写在随后不同的方式:
case when a is not null and b is not null then....
etc.
如果我用一个简单(a+b)/2
我得到null
其中一个值为null
。
也许最简单的方法是使用outer apply
与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
方法还是比较简单。
这是针对OP请求的可怕解决方案。 –
假设的情况时,他们都null
应导致null
平均,您可以用数学“绝招” (A+A)/2=A
和使用3210在一个相当优雅的时尚写这个,恕我直言:
(COALESCE(a, b) + COALESCE(b, a))/2
我总是忘记COALESCE! –
那么,如果我有他们四个?那么我将不得不使用:(a,b,c,d)和所有转换?如果其中一人是不是不那么空我就通过2只有一个值划分,对不对? – HeadOverFeet
尝试以下方法:
SELECT (ISNULL(a, b)+ISNULL(b, a))/2
这将是干净的解决方案
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 |
+----+------+------+--------+
'聚结((A + B)/ 2,B,A)'? – TZHX
如果A和B都为NULL,那么值应该是多少? – Stavr00
嗯......也许我失去了一些东西,但AVG()http://stackoverflow.com/questions/7367750/average-of-multiple-columns和检查马丁的答案。 – xQbert