PostgreSQL中SUM函数工作原理:为何按客户名分组求和?
关于PostgreSQL中SUM函数与GROUP BY的工作机制
你的困惑核心在于**GROUP BY customer_name子句的作用**,它直接决定了SUM函数的计算范围:
先拆解SQL的执行逻辑:
- 首先通过三次LEFT JOIN,把
order_details(订单详情)、products(产品)、orders(订单)、customers(客户)四张表关联起来,得到每条订单详情对应的客户名称和产品价格,此时结果是一条订单详情对应一行数据。 - 接着
GROUP BY customer_name会把所有行按照客户名称归类——相同客户名称的所有行被划分为一个单独的组。 - 这时
SUM(products.price)就不再是对全表的price求和,而是针对每个客户组内的所有产品价格分别计算总和。 - 最后
HAVING SUM(products.price) > 1000.00会过滤掉总和不足1000的客户分组,只保留符合条件的结果。
- 首先通过三次LEFT JOIN,把
用简单示例直观说明:
假设关联后的数据是:customer_name price 张三 500 张三 600 李四 300 李四 400 经过
GROUP BY customer_name后会分成两组:- 张三组:包含两行,price为500、600
- 李四组:包含两行,price为300、400
SUM函数分别计算每组的总和:张三组总和1100,李四组总和700,最终HAVING过滤后只保留张三的记录。
总结:聚合函数(SUM、COUNT、AVG等)的计算范围由GROUP BY决定——没有GROUP BY时对全表计算,有GROUP BY时按每个分组单独计算,这是SQL聚合查询的基础规则。
内容的提问来源于stack exchange,提问作者Semyon Mazepin
相关产品推荐
相关产品推荐

