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

How to assign zero(0) when the avg of a particular field is null in PostgreSQL

我有两个表:

Table 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

Table 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

当扫描整个 table 或其中的大部分时,在您加入 之前聚合 更便宜:

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 测试。

  • How to make a SELECT query in Hibernate includes Subquery COUNT(*)
  • Aggregate a single column in query with many columns