按业务分组,如果,有做过变更1取最新一次的金额,否则,金额求和

该SQL查询按arrair_id分组,检查组内是否有change_type=1的记录。如果有,则提取该change_type的最新金额;如果没有,则计算组内所有金额的总和。查询涉及到合同实例表contract_instance和合同财务表contract_finance,通过delete_flag过滤有效数据。

如图:按arrair_id分组,

如果,组内有为chang_type =1的,则取最新一个change_type=1的金额,

否则,组内金额求和sum

sql实现如下

select

count(ci.id) as count-- 合同数量

,if(

locate('1',GROUP_CONCAT(change_type order by ci.create_time desc)) >0 -- 如果,有变更时

, SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(money order by ci.create_time desc),',',locate('1',GROUP_CONCAT(change_type order by ci.create_time desc separator ''))),',',-1) -- 取最后一次变更金额

, sum(cf.money) -- 否则,金额的和

)

from contract_instance ci

left join contract_finance cf on cf.contract_id = ci.id

where ci.delete_flag = 0

group by ci.arrair_id -- 业务id分组

<think>我们有一个需求:使用pandas的groupby方法按年份对“资产投入金额”进行分组求和。假设数据集中有一个日期列(比如“投入日期”)和一个数值列(“资产投入金额”)。我们需要从日期中提年份,然后按年份分组并对资产投入金额求和。步骤:1.读数据(这里假设数据已经加载到DataFrame中,我们以df表示)。2.确保“投入日期”列是datetime类型,如果不是,先转换。3.从“投入日期”列提年份,可以创建一个新列“年份”。4.使用groupby按“年份”分组,然后对“资产投入金额”列求和。示例代码:假设DataFrame结构如下:df=pd.DataFrame({'投入日期':['2020-01-01','2020-06-15','2021-03-20','2021-11-11','2022-05-30'],'资产投入金额':[10000,15000,20000,25000,30000]})具体操作:```importpandasaspd#假设df是已有的DataFrame#将“投入日期”转换为datetime类型df['投入日期']=pd.to_datetime(df['投入日期'])#提年份,创建新列“年份”df['年份']=df['投入日期'].dt.year#按年份分组,对资产投入金额求和result=df.groupby('年份')['资产投入金额'].sum()#重置索引,使结果成为DataFrame(如果需要)result=result.reset_index()#或者直接使用,result是一个Series,索引是年份print(result)```输出示例:年份资产投入金额020202500012021450002202230000注意:如果数据集中有多年的数据,这样分组求和后,每个年份会有一行汇总。另一种方式:不创建新列,直接在groupby时提年份。代码示例:```result=df.groupby(df['投入日期'].dt.year)['资产投入金额'].sum().reset_index()result.columns=['年份','资产投入金额总和']#重命名列```这样也可以得到相同的结果。根据引用[^3],我们还可以同时使用多个聚合函数,但这里我们只需要求和。引用说明:[^1]提到groupby操作是将DataFrame按照指定字段划分为多个分组,然后基于子DataFrame进行操作。[^3]展示了使用groupby分组后使用agg进行聚合,包括求和和平均值。因此,我们的方法符合Pandas的groupby操作原理。如果用户的数据集中没有“投入日期”列,而是有一个表示年份的列,那么可以直接用该列分组。问题:如果日期列中有空值怎么办?在提年份之前,需要确保日期列没有空值,或者处理空值(比如填充或删除)。相关问题:1.如何按月份或季度分组求和?2.如何同时对多个列进行分组求和?3.在分组求和后,如何将结果合并回原始数据?4.分组求和时如何处理缺失值?5.除了求和,还有哪些常用的聚合函数?下面生成相关问题:§§相关问题§§1.如果我想按月份分组求和,应该怎么?2.如何对多个数值列(如资产投入金额和运营成本)同时按年份分组求和?3.在分组求和后,如何将每年的总投入金额合并回原始数据表?4.分组求和时,如果数据中有缺失值(如日期或金额为空),应该如何处理?5.除了求和,Pandas的groupby还支持哪些聚合函数?如何同时使用多个聚合函数?</think>### Pandas Groupby 按年份对资产投入金额分组求和示例 根据您的需求,我们将使用Pandas的`groupby`方法按年份对资产投入金额进行分组求和。以下是完整实现步骤和代码示例: #### 1. **数据准备** 假设您有包含`投入日期`和`资产投入金额`两列的DataFrame: ```python import pandas as pd data = { '投入日期': ['2023-01-15', '2023-07-20', '2024-03-10', '2024-11-05', '2023-05-30'], '资产投入金额': [10000, 15000, 20000, 25000, 12000] } df = pd.DataFrame(data) print("原始数据:") print(df) ``` #### 2. **转换日期为年份** 将日期列转换为`datetime`类型并提年份: ```python df['投入日期'] = pd.to_datetime(df['投入日期']) # 转换为datetime类型 df['年份'] = df['投入日期'].dt.year # 提年份 print("\n添加年份列后的数据:") print(df) ``` #### 3. **按年份分组求和** 使用`groupby`按年份分组并对金额求和: ```python # 方法1:直接分组求和(返回Series) yearly_sum = df.groupby('年份')['资产投入金额'].sum() print("\n按年份分组求和结果(Series):") print(yearly_sum) # 方法2:使用agg聚合(返回DataFrame) yearly_sum_df = df.groupby('年份').agg(总投入金额=('资产投入金额', 'sum')) print("\n按年份分组求和结果(DataFrame):") print(yearly_sum_df.reset_index()) # 重置索引使年份成为普通列 ``` #### 4. **输出结果** ``` 原始数据: 投入日期 资产投入金额 0 2023-01-15 10000 1 2023-07-20 15000 2 2024-03-10 20000 3 2024-11-05 25000 4 2023-05-30 12000 添加年份列后的数据: 投入日期 资产投入金额 年份 0 2023-01-15 10000 2023 1 2023-07-20 15000 2023 2 2024-03-10 20000 2024 3 2024-11-05 25000 2024 4 2023-05-30 12000 2023 按年份分组求和结果(Series): 年份 2023 37000 2024 45000 Name: 资产投入金额, dtype: int64 按年份分组求和结果(DataFrame): 年份 总投入金额 0 2023 37000 1 2024 45000 ``` #### 关键说明: 1. **分组原理**:`groupby('年份')`将数据按年份拆分为子DataFrame(2023年和2024年两个分组)[^1] 2. **聚合操作**:`sum()`对每个分组内的`资产投入金额`执行求和计算[^3] 3. **结果处理**:`reset_index()`将年份索引转换为普通列,便于后续分析 > **注意**:如果原始日期格式非标准,需先用`pd.to_datetime(df['投入日期'], format='%Y/%m/%d')`指定格式转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值