繁体   English   中英

在PostgreSQL中特定字段的平均值为空时如何分配零(0)

[英]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

您可以将COALESCELEFT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM