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

SQL技术求助:修正内连接与子查询以完成酒类销售统计需求

修正你的SQL代码,完成酒类销售数据分析需求

嘿,刚接触SQL遇到连接和子查询的问题太正常了,我来帮你一步步梳理错误,然后写出符合需求的代码~

首先先拆解你的原代码里的几个核心问题:

  • 表连接语法错误:你同时用了逗号分隔表和INNER JOIN,这会导致语法冲突,应该统一使用INNER JOIN来关联表
  • 未正确聚合销量:要计算人均销量,需要先统计每个县的总销量(用SUM()聚合),再除以该县人口,而不是直接用单条记录的bottle_qty
  • 子查询写法不规范且效率低:直接关联products表比子查询更直观高效
  • 分组字段与查询字段不匹配:GROUP BY需要包含所有非聚合的查询字段,同时你要的是9个县,LIMIT应该设为9而不是10

接下来我们分步骤完成你的三个需求:

需求1:找出人均酒类销量最高的9个县

先写这部分的基础查询,用CTE(公共表表达式)来保存结果,方便后续复用:

WITH top_9_counties AS (
    SELECT 
        c.county,
        -- 计算人均销量:总销量 / 人口
        ROUND(SUM(s.bottle_qty) / c.population, 2) AS sale_per_cap
    FROM sales s
    INNER JOIN counties c 
        ON s.county = c.county  -- 正确的表关联条件
    GROUP BY c.county, c.population  -- 分组字段要包含人口,因为它是非聚合字段
    ORDER BY sale_per_cap DESC  -- 按人均销量降序排序
    LIMIT 9  -- 取前9个县
)
SELECT * FROM top_9_counties;

需求2:计算这些县所售酒类的平均瓶容量(四舍五入保留一位小数)

基于上面的CTE,关联products表,计算所有在这9个县销售的酒品的平均瓶容量:

WITH top_9_counties AS (
    SELECT 
        c.county,
        ROUND(SUM(s.bottle_qty) / c.population, 2) AS sale_per_cap
    FROM sales s
    INNER JOIN counties c 
        ON s.county = c.county
    GROUP BY c.county, c.population
    ORDER BY sale_per_cap DESC
    LIMIT 9
)
SELECT 
    ROUND(AVG(p.bottle_size), 1) AS avg_bottle_size
FROM sales s
INNER JOIN top_9_counties t 
    ON s.county = t.county
INNER JOIN products p 
    ON s.item = p.item_no;

需求3:在上述9个县中,找出平均瓶容量最大的县

这次我们需要先计算每个县的平均瓶容量,再找出最大值对应的县:

WITH top_9_counties AS (
    SELECT 
        c.county,
        ROUND(SUM(s.bottle_qty) / c.population, 2) AS sale_per_cap
    FROM sales s
    INNER JOIN counties c 
        ON s.county = c.county
    GROUP BY c.county, c.population
    ORDER BY sale_per_cap DESC
    LIMIT 9
), county_avg_bottle AS (
    SELECT 
        t.county,
        ROUND(AVG(p.bottle_size), 1) AS county_avg_bottle_size
    FROM sales s
    INNER JOIN top_9_counties t 
        ON s.county = t.county
    INNER JOIN products p 
        ON s.item = p.item_no
    GROUP BY t.county
)
SELECT county, county_avg_bottle_size
FROM county_avg_bottle
ORDER BY county_avg_bottle_size DESC
LIMIT 1;

额外说明

  • 用CTE的好处是可以把复杂查询拆分成多个逻辑块,更易读和维护
  • 如果你的SQL版本不支持CTE(比如老版本MySQL),可以把CTE换成子查询嵌套,逻辑是一样的
  • ROUND()函数用来控制小数位数,根据需求调整第二个参数即可

内容的提问来源于stack exchange,提问作者Song Mei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:07:48