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
相关产品推荐
相关产品推荐

