You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:57:00