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

子查询逻辑返回结果不符问题排查及正确SQL解法解析

SQL结果不符的问题定位与分析

问题背景

执行自定义SQL子查询后得到结果4434.21,与预期结果4721.14不符。需求为:计算仅包含平均每单消费高于所有订单平均消费的公司的total_amt_usd生命周期平均值。

我的SQL代码

WITH t1 AS (SELECT AVG(o.total_amt_usd) total_avg
FROM orders o),

t2 AS(SELECT a.name account_name,
       a.id account_id,
       AVG(o.total_amt_usd) account_avg
FROM accounts a
JOIN orders o
  ON a.id = o.account_id
GROUP BY 1,2
HAVING AVG(o.total_amt_usd) > (SELECT * 
                              FROM t1)
)

SELECT AVG(o.total_amt_usd) 
FROM orders o
JOIN t2 
  ON t2.account_id = o.account_id

正确解法SQL

SELECT AVG(avg_amt)
FROM (
    SELECT o.account_id,
           AVG(o.total_amt_usd) avg_amt
    FROM orders o 
        GROUP BY 1
        HAVING AVG(o.total_amt_usd) > 
        (SELECT AVG(o.total_amt_usd) avg_all
        FROM orders o)
) t1

核心差异与错误原因

  • 你的SQL最后一步是对符合条件的公司的所有订单金额直接取整体平均值,相当于把这些公司的每一笔订单金额混在一起计算平均,这不是需求要的「生命周期平均值」。
  • 正确逻辑是:先筛选出平均每单消费高于全局平均的公司,计算每个公司自己的平均每单金额,再对这些公司的平均值求平均——这才是需求要求的「生命周期平均值」,也就是每个合格公司的平均消费值的再平均,而非所有订单的直接平均。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:43:19