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()
我需要查询去年和去年同一天每个商店的总销售额和访客数,目标是能够使用 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()