这是我的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。但是,鉴于默认行为,这是计算平均值的有意和首选方式。
答案 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