如何用SQLAlchemy实现不同表两列除法运算并计算平均值
使用SQLAlchemy实现跨表计算人均收入并求平均值
没问题,我来帮你搞定这个需求。咱们先从定义对应的SQLAlchemy模型开始,然后通过关联查询完成计算。
第一步:定义表模型
首先我们需要把company_info和company_income两张表映射成SQLAlchemy的模型类,这样后续才能用ORM进行操作:
from sqlalchemy import create_engine, Column, Integer, String, func from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker Base = declarative_base() # 对应company_info表 class CompanyInfo(Base): __tablename__ = 'company_info' id = Column(Integer, primary_key=True) company_name = Column(String) staff_num = Column(Integer) year = Column(Integer) # 对应company_income表 class CompanyIncome(Base): __tablename__ = 'company_income' id = Column(Integer, primary_key=True) company_name = Column(String) income = Column(Integer) year = Column(Integer) # 初始化数据库连接和会话 engine = create_engine('你的数据库连接字符串') # 比如 'sqlite:///test.db' Session = sessionmaker(bind=engine) session = Session()
第二步:执行跨表计算与平均值查询
我们需要通过company_name和year两个字段将两张表关联起来,计算每一组数据的income / staff_num(人均收入),然后对这个结果求平均值。这里特意加了nullif函数,避免出现staff_num为0时的除以0错误:
ORM方式查询(更贴近Python风格)
# 计算人均收入的平均值 avg_result = session.query( func.avg( CompanyIncome.income / func.nullif(CompanyInfo.staff_num, 0) ).label('average_per_capita_income') ).join( CompanyIncome, (CompanyInfo.company_name == CompanyIncome.company_name) & (CompanyInfo.year == CompanyIncome.year) ).scalar() print(f"人均收入平均值: {avg_result}")
SQL Core方式查询(偏向原生SQL风格)
如果你更喜欢用原生SQL的写法,也可以用SQLAlchemy Core来实现:
from sqlalchemy import select # 构建查询语句 query = select( func.avg( CompanyIncome.c.income / func.nullif(CompanyInfo.c.staff_num, 0) ).label('average_per_capita_income') ).select_from( CompanyInfo.join( CompanyIncome, (CompanyInfo.c.company_name == CompanyIncome.c.company_name) & (CompanyInfo.c.year == CompanyIncome.c.year) ) ) # 执行查询 result = engine.execute(query).scalar() print(f"人均收入平均值: {result}")
结果验证
用你给出的测试数据手动计算的话:
- 2010年A公司:10/10=1
- 2011年A公司:20/10=2
- 2012年A公司:30/20=1.5
- 2010年B公司:20/20=1
- 2011年B公司:15/5=3
平均值是(1+2+1.5+1+3)/5 = 1.7,所以查询结果会返回1.7左右,和预期一致。
内容的提问来源于stack exchange,提问作者jjdblast
相关产品推荐
相关产品推荐

