关于如何使用视图或存储过程在SQL中执行相同的问题?
我有一个由4列简化的销售表,即id,product_id,sale_date和数量。我想建立一个返回的请求: 1.对于每个product_id,按日期按行显示的总销售额 2.在每个行的每个ID的第7、15、30天的总销售额中
现在,我使用多个WITH视图,每列一个:
days7=session.query(Sales.product_id,func.sum(Sales.quantity).label('count')).\
filter(Sales.sale_date > now() - timedelta(days=7)).\
group_by(Sales.product_id).cte('days7')
...
req=session.query(Sales.product_id,days7.c.count.label('days7'),\
days15.c.count.label('days15'),\
days30.c.count.label('days30')).\
outerjoin(days7,days7.c.product_id==Sales.product_id).\
outerjoin(days15,days15.c.product_id==Sales.product_id).\
outerjoin(days30,days30.c.product_id==Sales.product_id).\
all()
它工作得很好,但是我不确定这是否是最好的方法。此外,如果我想添加前30天(或360天)的每个日期的计数,那就太疯狂了。这个想法可能是使用一个简单的for循环:
viewSumByDay=[]
for day in range(180):
date=now()-timedelta(days=day)
viewSumByDay.append(session.query(...).cte(str(date.date())))
可以创建视图。而且,尽管对于左联接,也应该使用req=req.outerjoin(viewSumByDay[day],...)
可以,但我现在仍然停留在如何使用循环将列添加到主查询中的问题上。
您看到另一个不错的解决方案吗?
非常感谢您的帮助!
答案 0 :(得分:0)
好的,抱歉,文档中描述了一个简单的req=req.add_column(...)
。
但是,如果有更漂亮的方法,我想知道。