在sqlalchemy中,如何在带有过滤器的联接表上使用聚合函数?

2024-05-23 19:53:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从下面的表中生成结果,我想用SQLALCHEMY(或文本SQL方法)连接它们。在

class Requisition(Base):
    __tablename__ = 'requisition'

    id = Column(Integer, primary_key=True)
    order_no = Column(Float)

class Budget(Base):
    __tablename__ = 'budget'

    id = Column(Integer, primary_key=True)
    budget_line = Column(String)
    amount = Column(Numeric(12,2))
    requisition_id = Column(Integer, ForeignKey('requisition.id'))
    requisition = relationship(Requisition)

我的目标是连接这些表,这样我就可以通过请购单编号和返回值分组依据预算行总计预算金额. 我试过无数种方法来写这篇文章,但却有各种各样的错误。这是我最近的尝试:

^{pr2}$

这是我得到的错误。(我从上面的表中删除了一些不必要的列,这些列不会影响错误,但您可以在异常响应中看到它们被引用。)

ProgrammingError:(ProgrammingError)列“请购单.id“必须出现在GROUP BY子句中或用于聚合函数行1:SELECT预算行作为预算预算行,申请。。。^'选择预算行作为预算线,请购单.id作为请购单编号,请购单编号作为请购单号,请购单名称作为请购单的名称,请购单创建日期申请创建日期为,请购单修改日期作为请购单修改日期,请购单.子项目_id作为请购单子项目_id,请购单.core_time_period作为请购单的核心时间段(预算金额)从预算、请购单\n中提取的金额\n预算.子项目_id=%(子项目_id_1)s和budget.budget_事务处理类型=%(预算事务处理类型1)s和订单号<;=%(当前订单号)s分组依据预算行“{current_order_no”:5,“预算事务处理类型”1:“原始预算”,“子项目编号1”:1}


Tags: 方法id类型base错误columninteger金额
1条回答
网友
1楼 · 发布于 2024-05-23 19:53:51

不要在选择列表中包含Requisition,而是显式地加入它。与text表达式相比,使用映射的类属性编写筛选器谓词更简洁。在

budgets_query = session.query(
    Budget.budget_line,
    func.sum(Budget.amount)
).\
    join(Requisition).\
    filter(Requisition.order_no <= current_order_no).\
    group_by(Budget.budget_line).\
    all()

如果您愿意,您还可以将关系Budget.requisition传递给join(),而不是实体。在

相关问题 更多 >