【问题标题】:Multiple aggregations on date ranges in DjangoDjango中日期范围的多个聚合
【发布时间】:2014-06-04 10:33:57
【问题描述】:

............型号............

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 名称--product1 描述--product1 周销售额总和--product1 月销售额总和

product2 名称--product2 描述--product2 周销售额总和--product2 月销售额总和


我应该使用原始 sql 吗?该查询会是什么样子?我应该尝试使用 sqlalchemy 还是可以在 Django ORM 中这样做?

【问题讨论】:

  • 你可以在你的视图中制作一本新字典,如果你想要的话,可以填写过去7天的sale_date的总和。

标签: python sql django sqlalchemy django-orm


【解决方案1】:

我建议您在 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]) 返回日期的月份部分
  • YEAR([date]) 返回日期的年份部分
  • ISNULL([field],[value_if_null]) 替换空值(mysql中的IFNULL([field],[value_if_null]))

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

如果您在 sql 方面需要一些帮助,请在上面发表评论并指定您的 RDBMS ;)

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 2021-04-16
    • 2014-12-29
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多