SQL / SQLAlchemy在不同日期的计数

时间:2018-07-13 01:20:14

标签: python sql sqlalchemy sum

  

关于如何使用视图或存储过程在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],...)可以,但我现在仍然停留在如何使用循环将列添加到主查询中的问题上。

您看到另一个不错的解决方案吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好的,抱歉,文档中描述了一个简单的req=req.add_column(...)

但是,如果有更漂亮的方法,我想知道。