You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 07:02:34