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

SQL中AVG函数返回错误值,如何计算指定国家供应商的平均账户余额

问题原因

  • 你的子查询(select Count(s_acctbal) AS counted from supplier)是独立计算全量supplier表的总记录数,返回固定值3000,和外层的国家筛选逻辑完全没有关联,和其他表通过笛卡尔积关联后,每一行的counted字段值都是3000,求平均后结果自然恒为3000。
  • 你当前的分组逻辑是按国家、供应商名称、账户余额分组,相当于每个供应商单独成一行,也不符合“按国家统计平均余额”的聚合需求。
  • 你混淆了聚合逻辑:平均账户余额是对s_acctbal字段本身求平均,不是对计数结果求平均。
  • 如果你不需要按区域维度做额外过滤,region表完全不需要关联,supplier和nation表直接通过nationkey关联就可以定位到对应国家的供应商。

正确查询写法

场景1:仅返回指定国家的平均账户余额单个统计值

SELECT AVG(s_acctbal) AS 中国供应商平均账户余额
FROM supplier s
JOIN nation n ON s.s_nationkey = n.n_nationkey
WHERE n.n_name = 'CHINA';

场景2:返回国家名称和对应平均余额,支持同时查询多个国家的统计值

SELECT 
  n.n_name AS 国家名称, 
  AVG(s.s_acctbal) AS 供应商平均账户余额
FROM supplier s
JOIN nation n ON s.s_nationkey = n.n_nationkey
-- 不加WHERE条件则返回所有国家的统计值
WHERE n.n_name IN ('CHINA', 'UNITED STATES')
GROUP BY n.n_name;

场景3:保留每个供应商明细的同时,显示对应国家的整体平均余额

SELECT 
  n.n_name AS 国家名称,
  s.s_name AS 供应商名称,
  s.s_acctbal AS 供应商账户余额,
  AVG(s.s_acctbal) OVER(PARTITION BY n.n_name) AS 对应国家供应商平均账户余额
FROM supplier s
JOIN nation n ON s.s_nationkey = n.n_nationkey
WHERE n.n_name = 'CHINA';

该查询会返回你之前看到的145行明细,最后一列为对应国家所有供应商的平均账户余额,不会再出现固定值3000的问题。


内容的提问来源于stack exchange,提问作者Chan Myae Tun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:02