基于AmendDate按年月分组求和Amount的SQLAlchemy查询实现
使用SQLAlchemy实现Loan_Amendment表按年月分组求和
嘿,我来帮你搞定这个SQLAlchemy的查询需求!先把咱们的基础信息理清楚:
原始Loan_Amendment表数据
| ID | Amount | AddDeduct | AmendDate |
|---|---|---|---|
| LT0000160 | 1000.000000000 | 2 | 2018-02-08 |
| LT0000170 | 1500.00000000 | 1 | 2018-02-10 |
| LN0000577 | 1000.000000000 | 1 | 2018-03-20 |
| LN0000587 | 2000.000000000 | 2 | 2018-03-20 |
需求说明
我们需要按AmendDate的年份和月份分组,对Amount字段进行求和。
SQLAlchemy实现代码
这里给你两种常用写法,你可以根据自己用的数据库(比如PostgreSQL、MySQL)来选:
方法1:提取年份和月份单独分组(通用型,适配多数数据库)
假设你的SQLAlchemy模型类是LoanAmendment(对应数据库里的Loan_Amendment表),代码如下:
from sqlalchemy import func # 构建查询 result = db.session.query( # 提取年份并命名为year func.year(LoanAmendment.AmendDate).label('year'), # 提取月份并命名为month func.month(LoanAmendment.AmendDate).label('month'), # 对Amount求和并命名为total_amount func.sum(LoanAmendment.Amount).label('total_amount') ).group_by( # 按年份和月份分组 func.year(LoanAmendment.AmendDate), func.month(LoanAmendment.AmendDate) ).all()
方法2:用date_trunc截断到月份(适合PostgreSQL等支持的数据库)
如果你的数据库支持date_trunc函数,这种写法更简洁,还能直接得到格式化的年月时间对象:
from sqlalchemy import func result = db.session.query( # 把日期截断到月份级别,命名为amend_month func.date_trunc('month', LoanAmendment.AmendDate).label('amend_month'), func.sum(LoanAmendment.Amount).label('total_amount') ).group_by( func.date_trunc('month', LoanAmendment.AmendDate) ).all()
代码细节解释
func.year()/func.month():从AmendDate里拆出年份和月份,label()是给结果列起别名,方便你后续从结果里取值。func.sum():对每个分组里的Amount做求和计算,同样用label()给结果列起个好读的名字。group_by():核心的分组逻辑,确保同一年月的记录会被聚合在一起计算总和。.all():执行查询并返回所有结果,比如方法1的结果会是[(2018, 2, 2500.0), (2018, 3, 3000.0)],完全符合需求。
小提醒
- 确保你的
LoanAmendment模型类和数据库表字段对应正确,比如AmendDate要对应表中的AmendDate列。 - 如果用的是MySQL,
func.month()是支持的;如果是SQL Server,可能要换成func.datepart('month', LoanAmendment.AmendDate),具体可以查对应数据库的函数文档。
内容的提问来源于stack exchange,提问作者Houy Narun
相关产品推荐
相关产品推荐

