按交易类型统计各交易方收发总额的双列求和实现方法
交易记录分类型统计实现方案
核心需求是按交易方维度去重,并排展示每个交易方的总转入、总转出金额,通过单轮分组+条件聚合即可实现,不需要多表关联或多次查询,性能最优。
- 聚合时仅对符合交易类型的金额做累加,非目标类型的金额记为0不参与求和
- 若需要统一交易方名称格式,可在分组前对
Party Name字段做大小写统一处理
方案1:SQL 实现(直接在数据库查询统计)
适用于数据存储在MySQL、PostgreSQL等关系型数据库的场景,核心用CASE WHEN做条件判断求和,代码如下:
SELECT LOWER(`Party Name`) AS `Party Name`, SUM(CASE WHEN `transaction type` = 'recived' THEN `Ammount` ELSE 0 END) AS `total recievedAmount`, SUM(CASE WHEN `transaction type` = 'send' THEN `Ammount` ELSE 0 END) AS `total send` FROM 替换为你的实际交易表名 GROUP BY LOWER(`Party Name`);
注意:代码中交易类型值
recived和你提供的源数据拼写保持一致,如果实际业务中字段值为正确拼写received,请对应修改判断条件,避免统计结果为0。如果不需要统一名称为小写,可去掉LOWER()函数,直接按原Party Name字段分组。
查询返回结果和期望格式完全一致:
| Party Name | total recievedAmount | total send |
|---|---|---|
| abc | 3000 | 6000 |
| xyz | 3000 | 2000 |
方案2:Python Pandas 实现(离线DataFrame数据处理)
适用于数据已经加载为Python Pandas DataFrame对象的离线处理场景,代码如下:
import pandas as pd # df 为你已加载完成的原始交易记录表DataFrame # 统一交易方名称为小写,匹配期望输出格式 df['Party Name'] = df['Party Name'].str.lower() # 分组聚合后重塑结构,得到分类型的求和结果 stat_result = df.groupby(['Party Name', 'transaction type'])['Ammount']\ .sum()\ .unstack(fill_value=0)\ .reset_index() # 重命名列,对齐期望输出格式 stat_result = stat_result.rename(columns={ 'recived': 'total recievedAmount', 'send': 'total send' })[['Party Name', 'total recievedAmount', 'total send']]
执行后stat_result的内容和期望统计结果完全一致。
内容的提问来源于stack exchange,提问作者Deepak Gudawalekar
相关产品推荐
相关产品推荐

