如何在SQL查询中按cEnrol分组添加费用总计列?
如何为同一cEnrol添加fee总和列?
我现有SQL语句:
SELECT cEnrol, name, course, month, year, status, fee FROM table
执行后得到结果:
| cEnrol | name | course | month | year | status | fee |
|---|---|---|---|---|---|---|
| 1 | Aaaa | Zzzzzz | 01 | 2023 | Active | 100 |
| 1 | Aaaa | Zzzzzz | 02 | 2023 | Active | 100 |
| 1 | Aaaa | Zzzzzz | 03 | 2023 | Complete | 100 |
| 2 | Bbbb | Yyyyyy | 01 | 2023 | Active | 200 |
| 2 | Bbbb | Yyyyyy | 02 | 2023 | Active | 200 |
| 2 | Bbbb | Yyyyyy | 03 | 2023 | Active | 200 |
| 2 | Bbbb | Yyyyyy | 03 | 2023 | Complete | 200 |
| 3 | Bbbb | Zzzzzz | 03 | 2023 | Active | 100 |
| 3 | Bbbb | Zzzzzz | 03 | 2023 | Complete | 100 |
希望新增sumFees列,显示同一cEnrol对应的所有fee总和,得到如下结果:
| cEnrol | name | course | month | year | status | fee | sumFees |
|---|---|---|---|---|---|---|---|
| 1 | Aaaa | Zzzzzz | 01 | 2023 | Active | 100 | 300 |
| 1 | Aaaa | Zzzzzz | 02 | 2023 | Active | 100 | 300 |
| 1 | Aaaa | Zzzzzz | 03 | 2023 | Complete | 100 | 300 |
| 2 | Bbbb | Yyyyyy | 01 | 2023 | Active | 200 | 800 |
| 2 | Bbbb | Yyyyyy | 02 | 2023 | Active | 200 | 800 |
| 2 | Bbbb | Yyyyyy | 03 | 2023 | Active | 200 | 800 |
| 2 | Bbbb | Yyyyyy | 03 | 2023 | Complete | 200 | 800 |
| 3 | Bbbb | Zzzzzz | 03 | 2023 | Active | 100 | 200 |
| 3 | Bbbb | Zzzzzz | 03 | 2023 | Complete | 100 | 200 |
我尝试过嵌套SELECT语句,但无法将总和关联到对应的cEnrol,请问该如何实现?
解决方案
方法1:使用窗口函数(推荐)
窗口函数是最简洁高效的实现方式,通过PARTITION BY按cEnrol分组计算总和:
SELECT cEnrol, name, course, month, year, status, fee, SUM(fee) OVER (PARTITION BY cEnrol) AS sumFees FROM table;
SUM(fee) OVER (PARTITION BY cEnrol)会针对每一行,计算当前行所属cEnrol分组下的所有fee总和,直接映射到对应行的sumFees列。
方法2:使用关联子查询
如果你的数据库不支持窗口函数,可以用关联子查询解决,核心是在子查询中添加关联条件,确保总和匹配当前行的cEnrol:
SELECT t1.cEnrol, t1.name, t1.course, t1.month, t1.year, t1.status, t1.fee, (SELECT SUM(fee) FROM table t2 WHERE t2.cEnrol = t1.cEnrol) AS sumFees FROM table t1;
这里子查询通过t2.cEnrol = t1.cEnrol关联主查询的行,保证每个cEnrol的总和只对应到相同编号的记录。
内容的提问来源于stack exchange,提问作者Matt Drake
相关产品推荐
相关产品推荐

