PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Django:Nhóm truy vấn theo tháng

Đầu tiên, bạn phải tạo một Hàm có thể trích xuất tháng cho bạn:

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

Sau đó, tất cả những gì bạn cần làm là

  1. chú thích từng hàng bằng tháng
  2. nhóm các kết quả theo tháng được chú thích bằng cách sử dụng values()
  3. chú thích từng kết quả bằng tổng được tổng hợp của các tổng bằng cách sử dụng Sum()

Quan trọng :nếu lớp mô hình của bạn có thứ tự mặc định được chỉ định trong các tùy chọn meta, thì bạn sẽ phải thêm một order_by() trống mệnh đề. Điều này là do https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

Các trường được đề cập trong order_by() một phần của bộ truy vấn (hoặc được sử dụng theo thứ tự mặc định trên một mô hình) được sử dụng khi chọn dữ liệu đầu ra, ngay cả khi chúng không được chỉ định khác trong các giá trị values() gọi điện. Các trường bổ sung này được sử dụng để nhóm các kết quả “thích” lại với nhau và chúng có thể làm cho các hàng kết quả giống hệt nhau có vẻ tách biệt.

Nếu không chắc chắn, bạn có thể thêm order_by() trống điều khoản nào mà không có bất kỳ tác dụng phụ nào.

tức là

from django.db.models import Sum

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

Xem toàn bộ ý chính tại đây:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17

Nếu bạn cần thêm thông tin:

Chi tiết về cách tạo các lớp Func của riêng bạn:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions

Thông tin chi tiết về mệnh đề giá trị (), (chú ý đến cách nó tương tác với annotate () theo thứ tự của các mệnh đề):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values

thứ tự mà các mệnh đề annotate () và giá trị () được áp dụng cho một truy vấn là quan trọng. Nếu mệnh đề giá trị () đứng trước chú thích (), chú thích sẽ được tính bằng cách sử dụng nhóm được mô tả bởi mệnh đề giá trị ().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lưu trữ hình ảnh trong PostgreSQL

  2. Lumen - Tạo kết nối cơ sở dữ liệu trong thời gian chạy

  3. Làm cách nào để cài đặt gem hoạt động trên OS X Lion với Ruby 1.8.7 mà không bị lỗi seg?

  4. Cách tạo Người dùng / Cơ sở dữ liệu trong tập lệnh cho Docker Postgres

  5. cài đặt postgres, khởi tạo cụm cơ sở dữ liệu không thành công (Postgresql Phiên bản 9.4.4)