验证一对多关联下SQL计算整体平均比值的查询正确性
你的SQL查询是否符合预期?
嘿,我来帮你拆解这个问题,先直接给结论:你当前的查询不符合预期,它的计算逻辑和你想要的完全不一样,我用你的示例数据给你一步步验证。
先明确你的期望逻辑
你想要的计算步骤是:
- 对每个公司,计算它的
order_count平均值 - 把这个平均值除以该公司的
value得到比值 - 最后计算所有公司这个比值的整体平均值
用你的示例数据手动计算:
- 公司1:
(20+40)/2 = 30→30/10 = 3 - 公司2:
(20+20)/2 = 20→20/20 = 1 - 整体平均值:
(3+1)/2 = 2(这是你要的目标结果)
你的原查询问题出在哪?
你的原SQL是:
SELECT (AVG(companies_products.order_count) / companies.value) as special_number FROM companies JOIN companies_products on companies_products.company_id = companies.id
这个查询没有分组,逻辑完全走偏了:
AVG(companies_products.order_count)是所有4条记录的平均值:(20+40+20+20)/4 = 25- 对于
companies.value,因为没有GROUP BY,在严格的SQL模式下会直接报错(非聚合列不能出现在SELECT里);在宽松模式(比如MySQL关闭ONLY_FULL_GROUP_BY)下,数据库会随机选一个公司的value(比如10或20) - 最终结果要么是
25/10=2.5,要么是25/20=1.25,都和你期望的2不符
正确的查询应该怎么写?
你需要先按公司分组计算每个公司的order_count平均值,再关联公司表拿到value计算比值,最后求这些比值的平均:
SELECT AVG(company_order_avg / c.value) AS special_number FROM ( -- 子查询:先算每个公司的order_count平均值 SELECT company_id, AVG(order_count) AS company_order_avg FROM companies_products GROUP BY company_id ) AS cp_avg JOIN companies c ON cp_avg.company_id = c.id
用你的示例数据跑这个查询,得到的结果就是你想要的2。
关于提问被踩的可能原因
在Stack Overflow上,提问被踩通常有这些常见原因:
- 最初提问时表述不够清晰:比如没有明确拆解你想要的计算步骤,或者没给出示例数据和期望结果(你后来补充了,但如果最初没给的话会让别人难理解)
- 格式不规范:没有用代码块包裹SQL、示例数据,导致内容杂乱难读
- 重复提问:类似的SQL分组计算问题已经有很多成熟回答,属于重复问题
- 没有展示排查过程:比如你说“暂未找到验证方法”,如果能说明你尝试过哪些验证步骤(比如手动计算、测试小数据),会更受欢迎
内容的提问来源于stack exchange,提问作者Alex Harris
相关产品推荐
相关产品推荐

