sql >> Database teknologi >  >> RDS >> PostgreSQL

Django:Forespørgselsgruppe efter måned

Først skal du lave en funktion, der kan udtrække måneden for dig:

from django.db import models
from django.db.models import Func

class Month(Func):
    function = 'EXTRACT'
    template = '%(function)s(MONTH from %(expressions)s)'
    output_field = models.IntegerField()

Derefter er alt hvad du skal gøre

  1. anmærk hver række med måneden
  2. grupper resultaterne efter den kommenterede måned ved hjælp af values()
  3. anmærk hvert resultat med den aggregerede sum af totalerne ved hjælp af Sum()

Vigtigt :hvis din modelklasse har en standardrækkefølge angivet i metaindstillingerne, så bliver du nødt til at tilføje en tom order_by() klausul. Dette er på grund af https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

Felter, der er nævnt i order_by() del af et forespørgselssæt (eller som bruges i standardrækkefølgen på en model) bruges ved valg af outputdata, selvom de ikke på anden måde er angivet i values() opkald. Disse ekstra felter bruges til at gruppere "synes godt om" resultater sammen, og de kan få ellers identiske resultatrækker til at se ud til at være adskilte.

Hvis du er usikker, kan du bare tilføje den tomme order_by() klausul alligevel uden nogen negative virkninger.

dvs.

from django.db.models import Sum

summary = (Invoice.objects
              .annotate(m=Month('date'))
              .values('m')
              .annotate(total=Sum('total'))
              .order_by())

Se hele indholdet her:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17

Hvis du har brug for yderligere information:

Detaljer om oprettelse af dine egne Func-klasser:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions

Detaljer om klausulen values() (vær opmærksom på, hvordan den interagerer med annotate() med hensyn til rækkefølgen af ​​klausulerne):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values

rækkefølgen, hvori annotate() og values()-sætninger anvendes på en forespørgsel, er signifikant. Hvis values()-sætningen går forud for annotate(), vil annoteringen blive beregnet ved hjælp af grupperingen beskrevet af values()-sætningen.



  1. Hvad er det maksimale antal kolonner i en PostgreSQL-valgsforespørgsel

  2. Implementering og administration af PostgreSQL 11:Nyt i ClusterControl 1.7.1

  3. Beregn antallet af samtidige hændelser i SQL

  4. MySQL SELECT sidste par dage?