2015-02-13 2 views
0

кажется простыми, но ... У меня есть данные, как так: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 для 3.

Есть ли простая вещь, которую я здесь отсутствует?

ответ

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 
+0

Да, это хорошо. К сожалению, в моей работе у меня 15 столбцов, поэтому это большая уродливая линия, но это жизнь SQL. – Wells

+0

Да, SQL оптимизирован для операций с колонками, а не с строк. Иногда мне было полезно писать сценарии с отложенными сценариями для генерации долгосрочных, но предсказуемых и структурированных SQL-запросов. –

Смежные вопросы