Django中日期范围的多个聚合

时间:2014-04-20 06:19:31

标签: python sql django sqlalchemy django-orm

............模型............

class Product(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=140)
    description = tinymce_models.HTMLField()

class Purchase(models.Model):
    user = models.ForeignKey(User, blank=True, null=True)
    product = models.ForeignKey(Product)
    sale_date = models.DateTimeField(auto_now_add=True)
    price = models.DecimalField(max_digits=6, decimal_places=2)

我希望获得一个输出,其中显示过去一个月和过去一周产品的购买价格总和,但希望为多个产品执行此操作。


输出看起来像我可以在我的模板中循环...

product1 name-- product1 description - product1每周销售总和 - product1月销售额之和

产品2名称 - 产品2描述 - 产品2每周销售总和 - 产品2月销售额之和


我应该使用原始sql吗?那个查询会是什么样的?我应该尝试使用sqlalchemy,还是可以在Django ORM中使用?

1 个答案:

答案 0 :(得分:0)

我建议你在sql语句中执行它,因为sql更好地操作数据,求和它...你的代码将设法从RDBMS检索数据并显示它...

我不知道你的RDBMS是什么,但我在sql server中给你一个例子,其他RDBMS中的语法大约是95%。 您的查询应如下所示:

SELECT
    prod.product_id
    ,prod.description
    ,ISNULL(weekSales.priceSum,0) as weekSales
    ,ISNULL(monthSales.priceSum,0) as monthSales
FROM
    Product prod
    left join (
        SELECT
            product_id
            ,sum(price) as priceSum
        FROM Purchase
        WHERE DATEPART(wk,sale_date) = DATEPART(wk,GETDATE())
        GROUP BY product_id) weekSales
        on prod.product_id = weekSales.product_id
    left join (
        SELECT
            product_id
            ,sum(price) as priceSum
        FROM Purchase
        WHERE 
            month(sale_date) = MONTH(GETDATE())
            AND year(sale_date) = year(GETDATE())
        GROUP BY product_id) monthSales
        on prod.product_id = monthSales.product_id

Here you can see a demo of this query with SQLFiddle

在sql server中,

  • GETDATE()返回当前日期
  • DATEPART(wk,[date])返回日期的一周部分(在mysql中的WEEK([date])函数)
  • MONTH([date])返回日期的月份部分
  • 年([日期])返回日期的一部分
  • ISNULL([field],[value_if_null])在mysql中替换空值(IFNULL([field],[value_if_null]))

您应该能够在所有RDBMS中找到类似的功能。

如果您在sql中需要一些帮助,请在上面注释并指定您的RDBMS;)

希望它有所帮助。