Oracle SQL如何按Zone和Site分组添加总计列?
实现按Zone和Site分组求和并添加总计列
当然可以搞定这个需求!你需要用到窗口函数(Window Functions),它能完美实现「保留所有原始行数据,同时添加分组统计值」的效果。
原始数据
| ZONE | SITE | BRAND | VALUE |
|---|---|---|---|
| north | a | a_brand1 | 10 |
| north | a | a_brand2 | 15 |
| north | a | a_brand3 | 27 |
| south | b | b_brand1 | 17 |
| south | b | b_brand2 | 5 |
| south | b | b_brand3 | 56 |
解决方案(推荐:窗口函数)
使用SUM()窗口函数,通过PARTITION BY指定分组规则,就能为每一行添加上对应Zone+Site的总和:
SELECT ZONE, SITE, BRAND, VALUE, SUM(VALUE) OVER (PARTITION BY ZONE, SITE) AS TOTAL_IN_SITE FROM your_table_name;
语句说明:
SUM(VALUE):计算VALUE列的总和OVER (PARTITION BY ZONE, SITE):将数据按ZONE和SITE的组合划分成不同的「窗口」,每个窗口内独立计算总和- 这种方式不会像普通
GROUP BY那样合并行,能保留所有原始数据的同时新增总计列
执行结果
| ZONE | SITE | BRAND | VALUE | TOTAL_IN_SITE |
|---|---|---|---|---|
| north | a | a_brand1 | 10 | 52 |
| north | a | a_brand2 | 15 | 52 |
| north | a | a_brand3 | 27 | 52 |
| south | b | b_brand1 | 17 | 78 |
| south | b | b_brand2 | 5 | 78 |
| south | b | b_brand3 | 56 | 78 |
兼容旧版本数据库的替代方案
如果你的数据库不支持窗口函数(比如MySQL 5.7及更早版本),可以用子查询+关联的方式实现:
SELECT t1.ZONE, t1.SITE, t1.BRAND, t1.VALUE, t2.TOTAL_IN_SITE FROM your_table_name t1 JOIN ( -- 先计算每个Zone+Site的总和 SELECT ZONE, SITE, SUM(VALUE) AS TOTAL_IN_SITE FROM your_table_name GROUP BY ZONE, SITE ) t2 ON t1.ZONE = t2.ZONE AND t1.SITE = t2.SITE;
这个方法先通过子查询得到分组总和,再将其与原表关联,从而为每一行匹配对应的总计值。
内容的提问来源于stack exchange,提问作者Madmartigan
相关产品推荐
相关产品推荐

