如何结合JOIN、聚合函数与GROUP BY?SQL餐厅平均评分去重问题
解决餐厅平均评分与唯一名称的问题
嘿,我来帮你搞定这个问题!你现在遇到的核心问题是直接关联Reviews表会因为每个餐厅有多条评论,导致餐厅名称重复出现。要让每个餐厅名称只返回一次,关键是先算出每个餐厅的平均评分,再和餐厅表关联,而不是先关联评论表再计算平均。
正确的SQL语句
SELECT rest.Name, avg_reviews.Average FROM [dbo].[Resteraunts] AS rest LEFT JOIN ( -- 子查询:按餐厅分组计算平均评分,每个餐厅仅一条记录 SELECT ResterauntId, AVG(Rating) AS Average FROM [dbo].[Reviews] GROUP BY ResterauntId ) AS avg_reviews ON rest.ResterauntId = avg_reviews.ResterauntId
为什么这个写法能解决问题?
- 子查询
avg_reviews会先对Reviews表按ResterauntId分组,计算出每个餐厅的平均评分,这样每个餐厅在子查询里只会有一条记录。 - 再将这个子查询和
Resteraunts表关联,就能保证每个餐厅名称只返回一次,同时拿到对应的平均评分。 - 用
LEFT JOIN的好处是:即使餐厅没有任何评论,也会被包含在结果里(平均评分显示为NULL)。如果只想要有评论的餐厅,把LEFT JOIN换成INNER JOIN就行。
为什么你原来的写法会重复?
你原来的思路是先把Reviews和Resteraunts关联,再去关联平均评分的子查询——这相当于先把每条评论和餐厅信息绑定,再去匹配平均评分,结果自然是一条评论对应一行数据,餐厅名称也就跟着重复了。而先计算平均再关联,从源头上避免了重复记录。
内容的提问来源于stack exchange,提问作者Curious-programmer
相关产品推荐
相关产品推荐

