看起来很简单,但是......我有这样的数据:
pid score1 score2 score3
1 1 3 2
2 3 1
3 4
我想只在非空值的情况下为三者做平均分。类似于sum(score1+score2+score3)/3
,但分母基本上必须是给定行的非空值的总和,因此3代表pid 1
,2代表2
,1代表{ {1}}。
我在这里缺少一件简单的事吗?
答案 0 :(得分:1)
with t(pid, score1, score2, score3) as (
values (1,1,3,2), (2,3,null,1), (3,4,null,null)
)
select
(sum(score1) + sum(score2) + sum(score3))::numeric /
(count(score1) + count(score2) + count(score3))
as avg,
avg(coalesce(score1, 0) + coalesce(score2, 0) + coalesce(score3, 0))
as avg2
from t;
avg | avg2
--------------------+--------------------
2.3333333333333333 | 4.6666666666666667