SQLalchemy 合并来自相同 table 的两个查询

SQLalchemy merge two queries from same table

我需要查询去年和去年同一天每个商店的总销售额和访客数,目标是能够使用 jinja2 在 table 中显示。 我目前有两个关于 Union 的查询...

    this_year = db.session.query(Sales.name,
                                   func.sum(Sales.sales).label('total_sales'),
                                   func.sum(Sales.guests).label('total_guests')
                                   ).filter(Sales.date >= start_day,
                                            Sales.date <= end_day
                                            ).group_by(Sales.name)


    last_year = db.session.query(Sales.name,
                                   func.sum(Sales.sales).label('total_sales'),
                                    func.sum(Sales.guests).label('total_guests')
                                   ).filter(Sales.date >= start_day_ly,
                                           Sales.date <= end_day_ly
                                            ).group_by(Sales.name)


    daily_table = this_year.union(last_year).all()

...但它给了我一个这样的列表:

STORE 1, SALES, GUESTS
STORE 1, SALES_LY, GUESTS_LY
STORE 2, SALES, GUESTS
STORE 2, SALES_LY, GUESTS_LY
ETC,,

我想要的是:

STORE 1, SALES, SALES_LY, GUESTS, GUESTS_LY
STORE 2, SALES, SALES_LY, GUESTS, GUESTS_LY
class Sales(db.Model):

    __tablename__ = 'Sales'

    id = db.Column(db.Integer, primary_key=True)
    date = db.Column(db.String(64))
    daypart = db.Column(db.String(64))
    name = db.Column(db.String(64))
    sales = db.Column(db.Integer)
    guests = db.Column(db.Integer)

数据: |id|date|daypart|name|sales|guests| |-----|-----|-----|-----|-----|-----| |14896| 2021-11-22|晚餐|商店 1| 11250.05| 288| |14897| 2021-11-22|午餐|商店 1| 9250.25| 157| |14898| 2021-11-22|晚餐|商店 2| 5764.95| 169| |14899| 2021-11-22|午餐|商店 2| 5856.25| 168| |14900| 2021-11-22|晚餐|商店 3| 9186.7| 320| |14901| 2021-11-22|午餐|商店 3| 7521.0| 175|

这个数据可以追溯到几年前。 我查看了 GROUP_BY、SUBQUERY、CASE、JOIN,但没有找到有效的解决方案。

你必须使用with_entities,并使用and_

this_year = db.session.query(Sales)
            .filter(and_(Sales.date >= start_day, Sales.date <= end_day))
            .with_entities(
                Sales.name.label('name'),
                func.sum(Sales.sales).label('total_sales'),
                func.sum(Sales.guests).label('total_guests')
            )
            .group_by(Sales.name)

last_year = db.session.query(Sales)
            .filter(and_(Sales.date >= start_day_ly,Sales.date <= end_day_ly))
            .with_entities(
                Sales.name.label('name'),
                func.sum(Sales.sales).label('total_sales'),
                func.sum(Sales.guests).label('total_guests')
            )
            .group_by(Sales.name)

daily_table = this_year.union(last_year).all()