gpt4 book ai didi

python - SQLAlchemy 中带计数的子查询

转载 作者:太空狗 更新时间:2023-10-30 02:56:41 26 4
gpt4 key购买 nike

给定这些 SQLAlchemy 模型定义:

class Store(db.Model):
__tablename__ = 'store'

id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)


class CustomerAccount(db.Model, AccountMixin):
__tablename__ = 'customer_account'

id = Column(Integer, primary_key=True)
plan_id = Column(Integer, ForeignKey('plan.id'), index=True, nullable=False)

store = relationship('Store', backref='account', uselist=False)
plan = relationship('Plan', backref='accounts', uselist=False)


class Plan(db.Model):
__tablename__ = 'plan'

id = Column(Integer, primary_key=True)
store_id = Column(Integer, ForeignKey('store.id'), index=True)
name = Column(String, nullable=False)
subscription_amount = Column(Numeric, nullable=False)
num_of_payments = Column(Integer, nullable=False)
store = relationship('Store', backref='plans')

如何编写查询以按计划获取订阅收入明细?我想取回给定商店的计划列表,以及每个计划的总收入,计算方法是乘以 Plan.subscription_amount * Plan.num_of_payments * 订阅该计划的客户数

目前我正在尝试使用此查询和子查询:

store = db.session.query(Store).get(1)

subscriber_counts = db.session.query(func.count(CustomerAccount.id)).as_scalar()

q = db.session.query(CustomerAccount.plan_id, func.sum(subscriber_counts * Plan.subscription_amount * Plan.num_of_payments))\
.outerjoin(Plan)\
.group_by(CustomerAccount.plan_id)

问题是子查询没有过滤当前计划 ID。

我也尝试过这种其他方法(没有子查询):

q = db.session.query(CustomerAccount.plan_id, func.count(CustomerAccount.plan_id) * Plan.subscription_amount * Plan.num_of_payments)\
.outerjoin(Plan)\
.group_by(CustomerAccount.plan_id, Plan.subscription_amount, Plan.num_of_payments)

虽然结果看起来不错,但我不知道如何取回计划名称或其他计划列,因为我需要将它们添加到分组依据(这会改变结果)。

理想情况下,如果计划没有任何订阅者,我希望返回时总金额为零。

谢谢!

最佳答案

感谢 Alex Grönholm 在 #sqlalchemy 上的发言,我最终得到了这个可行的解决方案:

from sqlalchemy.sql.expression import label
from sqlalchemy.sql.functions import coalesce

from instalment.models import db
from sqlalchemy import func, desc


def projected_total_money_volume_breakdown(store):
subscriber_counts = db.session.query(
CustomerAccount.plan_id,
func.count(CustomerAccount.id).label('count')
).group_by(CustomerAccount.plan_id) \
.subquery()

total_amount_exp = coalesce(
subscriber_counts.c.count, 0
) * Plan.subscription_amount * Plan.num_of_payments

return db.session.query(
Plan,
label('total_amount', total_amount_exp)
) \
.outerjoin(subscriber_counts, subscriber_counts.c.plan_id == Plan.id) \
.filter(Plan.store == store) \
.order_by(desc('total_amount')) \
.all()

关于python - SQLAlchemy 中带计数的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39792884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com