【问题标题】:Django grouped annotation percentage with a single queryDjango 使用单个查询对注释百分比进行分组
【发布时间】:2020-09-06 17:10:06
【问题描述】:

我要做的是计算每个工作日amount 的百分比,我知道如何在两个查询中完成,但我想知道是否有办法在一个查询中完成?

例如,如果我有模型:

class DailyAmount(models.Model):
  date = models.DateField()
  amount = models.DecimalField()

我可以在两个查询中获得每个工作日的百分比金额,如下所示:

total_amount = models.DailyAmount.objects.all().aggregate(total=Sum("amount"))["amount"]
result = models.DailyAmount.objects.all().annotate(
  weekday=ExtractWeekDay("date")
).values("weekday").annotate(
  percentage=ExpressionWrapper(
    Sum("amount") * 100.0 / total_amount,
    output_field=DecimalField()
  )
)

有没有办法把它们结合起来?我已经查看了 SubqueryWindow,但我都无法正常工作,而且我确定我错过了一些东西。

【问题讨论】:

    标签: django django-queryset django-orm


    【解决方案1】:

    事实证明我已经相当接近了:

    result = models.DailyAmount.objects.all().annotate(
      weekday=ExtractWeekDay("date")
    ).values("weekday").distinct().annotate(
      amount_total=Window(
        expression=Sum("amount")
      )
    ).annotate(
      weekday_total=Window(
        expression=Sum("amount"), partition_by=[F("weekday")],
      )
    ).annotate(
      group_percentage=ExpressionWrapper(
        F("weekday_total") * 100.0 / F("amount_total"),
        output_field=DecimalField(),
      )
    )
    

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 1970-01-01
      • 2011-01-04
      • 2016-12-30
      • 2010-12-31
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      相关资源
      最近更新 更多