2 votes

Pourcentage d'annotation groupée de Django avec une seule requête

Ce que j'essaie de faire c'est de calculer le pourcentage de amount pour chaque jour de la semaine, je sais comment le faire en deux requêtes, mais je me demande s'il existe un moyen de le faire en une seule ?

Par exemple, si j'ai le modèle :

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

Je peux obtenir les pourcentages pour chaque jour de la semaine en deux requêtes comme suit :

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()
  )
)

Y a-t-il un moyen de les combiner ? J'ai examiné les deux Subquery y Window mais je n'arrive à faire fonctionner ni l'un ni l'autre et je suis sûr que je rate quelque chose.

2voto

Darkstarone Points 2394

Il s'avère que j'étais assez proche :

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(),
  )
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X