PostgreSQL中如何获取指定列的SUM总和与AVG平均值
问题核心原因
- 对
GROUP BY的作用理解有误:GROUP BY会将指定字段取值完全相同的行合并为同一个分组,你当前将product_name、unit_cost、total三个字段都加入了分组字段列表,相当于每条原始数据本身就是一个独立分组,因此SUM(total)、AVG(total)计算的都是单一行的聚合结果,自然和原行数值完全一致。 - 聚合字段匹配错误:你需要统计的是
unit_cost列的总和和平均值,但现有查询中聚合的是total字段,就算分组逻辑正确,也无法得到你需要的结果。
对应解决方法
场景1:只需要全表unit_cost的总和、平均值,不需要明细数据
直接省略GROUP BY,仅保留聚合函数即可,查询语句如下:
SELECT SUM(unit_cost) AS sum_unit_cost, AVG(unit_cost) AS avg_unit_cost FROM products;
执行后只会返回一行结果,就是全表unit_cost列的总求和值与平均值。
场景2:需要保留所有行的明细数据,同时每行都展示全局的聚合结果
使用窗口函数实现,不需要加GROUP BY,查询语句如下:
SELECT product_name, unit_cost, units, total, SUM(unit_cost) OVER() AS global_sum_unit_cost, AVG(unit_cost) OVER() AS global_avg_unit_cost FROM products;
内容的提问来源于stack exchange,提问作者Robin Sage
相关产品推荐
相关产品推荐

