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

验证一对多关联下SQL计算整体平均比值的查询正确性

你的SQL查询是否符合预期?

嘿,我来帮你拆解这个问题,先直接给结论:你当前的查询不符合预期,它的计算逻辑和你想要的完全不一样,我用你的示例数据给你一步步验证。

先明确你的期望逻辑

你想要的计算步骤是:

  1. 对每个公司,计算它的order_count平均值
  2. 把这个平均值除以该公司的value得到比值
  3. 最后计算所有公司这个比值的整体平均值

用你的示例数据手动计算:

  • 公司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

这个查询没有分组,逻辑完全走偏了:

  1. AVG(companies_products.order_count)是所有4条记录的平均值:(20+40+20+20)/4 = 25
  2. 对于companies.value,因为没有GROUP BY,在严格的SQL模式下会直接报错(非聚合列不能出现在SELECT里);在宽松模式(比如MySQL关闭ONLY_FULL_GROUP_BY)下,数据库会随机选一个公司的value(比如10或20)
  3. 最终结果要么是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:10