PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Django:Grup Kueri Berdasarkan Bulan

Pertama, Anda harus membuat Fungsi yang dapat mengekstrak bulan untuk Anda:

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

Setelah itu yang perlu Anda lakukan adalah

  1. beri keterangan pada setiap baris dengan bulan
  2. kelompokkan hasil berdasarkan bulan beranotasi menggunakan values()
  3. menganotasi setiap hasil dengan jumlah agregat dari total menggunakan Sum()

Penting :jika kelas model Anda memiliki urutan default yang ditentukan dalam opsi meta, maka Anda harus menambahkan order_by() kosong ayat. Ini karena https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

Bidang yang disebutkan dalam order_by() bagian dari kumpulan kueri (atau yang digunakan dalam pengurutan default pada model) digunakan saat memilih data keluaran, meskipun tidak ditentukan lain dalam values() panggilan. Kolom tambahan ini digunakan untuk mengelompokkan hasil “suka” dan dapat membuat baris hasil yang identik tampak terpisah.

Jika Anda tidak yakin, Anda bisa menambahkan order_by() yang kosong klausa tetap tanpa efek samping.

yaitu

from django.db.models import Sum

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

Lihat inti lengkapnya di sini:https://Gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17

Jika Anda membutuhkan informasi lebih lanjut:

Detail tentang membuat kelas Func Anda sendiri:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions

Detail tentang klausa values(), (perhatikan bagaimana ia berinteraksi dengan annotate() sehubungan dengan urutan klausa):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values

urutan penerapan klausa annotate() dan values() ke kueri adalah signifikan. Jika klausa values() mendahului annotate(), anotasi akan dihitung menggunakan pengelompokan yang dijelaskan oleh klausa values().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Load Balancing PostgreSQL di Cloud Menjadi Mudah

  2. Gunakan output teks dari fungsi sebagai kueri baru

  3. Desain database temporal, dengan twist (live vs draft rows)

  4. Bekerja menuju Postgres-XL 9.5

  5. Apakah ada sesuatu seperti fungsi Zip() di PostgreSQL yang menggabungkan dua array?