Postgres Average计算忽略null

时间:2018-03-29 13:14:08

标签: postgresql

这是我的postgres表

 name   | revenue   
--------+---------  
 John   |     100  
 Will   |     100  
 Tom    |     100   
 Susan  |     100   
 Ben    |        
(5 rows)

在这里,当我计算收入的平均值时,它返回100,这显然不是这种情况,总和/计数,即400/5是80.这种行为是通过传统设计还是我忽略了这一点?

我知道我可以change null to 0 and process as usual。但是,鉴于默认行为,这是计算平均值的有意和首选方式。

2 个答案:

答案 0 :(得分:3)

这既是有意也是完全合乎逻辑的。请注意,NULL表示该值为 unknown

例如,它可能代表一个将在未来某个日期填写的值。如果未来价值为0,则平均值为400 / 5 = 80,正如您所说;但如果未来价值为200,则平均值将为600 / 5 = 120。我们现在所知道的是已知值的平均值为400 / 4 = 100

如果您确实知道此商品的收入为0,则应将0存储在该列中。如果您不知道该项目的收入,则应将其从计算中排除,这正是遵循SQL标准的Postgres为您所做的。

如果您无法修复数据,但实际情况是此表中的所有NULL都应被视为0 - 或者作为其他固定值 - 您可以使用聚合内的COALESCE

 SELECT AVG(COALESCE(revenue, 0)) as forced_average

答案 1 :(得分:1)

您应该为空收入强制使用0值。

create table tbl (name varchar(10), revenue int);
insert into tbl values
('John', 100), ('Will', 100), ('Tom', 100), ('Susan', 100), ('Ben', null);
5 rows affected
select avg(case when revenue is null then 0 else revenue end) from tbl;
|                 avg |
| ------------------: |
| 80.0000000000000000 |
select avg(coalesce(revenue,0)) from tbl;
|                 avg |
| ------------------: |
| 80.0000000000000000 |

dbfiddle here