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

