Django的分组标注百分比,只需一个查询即可。

问题描述 投票:1回答:1

我想做的是计算出的百分比。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个回答
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(),
  )
)
© www.soinside.com 2019 - 2024. All rights reserved.