[英]How to assign zero(0) when the avg of a particular field is null in PostgreSQL
我有两个表:
表user_ratings
id home_info_id ratings
1 1 3.5
2 2 3.5
3 1 4
4 1 5
5 1 2
6 2 1
7 2 4
表home_info
:
id home_name
1 my_home
2 ur_home
3 his_home
如您所见,“ my_home”和“ ur_home”具有评级,但“ his_home”尚未评级。 我正在计算所有房屋的平均值,因此我只得到两个房屋的平均值,即“ my_home”和“ ur_home”,因为我说“ his_home”尚未评级,因此我在查询中没有得到“ his_home”下面。 我想要所有尚未评级的房屋名称。 这是我的查询:
select u.home_info_id
, avg(u.ratings)
, h.home_name
from user_ratings u
, home_info h
where h.id = u.home_info_id
group by u.home_info_id
, h.home_name;
输出是这样的:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
但是我想要这样的东西:
home_info_id ratings home_name
1 4.83 my_home
2 2.83 ur_home
3 0 his_home
您可以将COALESCE
与LEFT JOIN
一起使用(而不是隐式INNER JOIN
):
select h.id
, coalesce(avg(u.ratings), 0)
, h.home_name
from home_info h
left join user_review u on h.id = u.home_info_id
group by h.id
, h.home_name
扫描整个表或其中的大部分表时, 在加入之前进行聚集比较便宜:
SELECT h.id, h.home_name
, COALESCE(u.avg_rating, 0) AS avg_rating
FROM home_info h
LEFT JOIN (
SELECT home_info_id AS id, avg(ratings) AS avg_rating
FROM user_review
GROUP BY 1
) u USING (id);
用EXPLAIN ANALYZE
测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.