postgreSQL:平均非空值

时间:2015-02-13 20:05:46

标签: postgresql

看起来很简单,但是......我有这样的数据:

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}}。

我在这里缺少一件简单的事吗?

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