sql >> データベース >  >> RDS >> PostgreSQL

Django:月ごとのクエリグループ

    まず、月を抽出できる関数を作成する必要があります:

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

    その後、あなたがする必要があるのは

    1. 各行に月の注釈を付ける
    2. values()を使用して、注釈付きの月ごとに結果をグループ化します
    3. Sum()を使用して、合計の合計で各結果に注釈を付けます

    重要 :モデルクラスのメタオプションでデフォルトの順序が指定されている場合は、空のorder_by()を追加する必要があります 句。これは、https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

    が原因です。

    order_by()で言及されているフィールド クエリセットの一部(またはモデルのデフォルトの順序で使用される)は、values()で特に指定されていない場合でも、出力データを選択するときに使用されます。 電話。これらの追加のフィールドは、「いいね」の結果をグループ化するために使用され、それ以外の場合は同一の結果行が別々に見えるようにすることができます。

    よくわからない場合は、空のorder_by()を追加するだけです。 とにかく悪影響なしに条項。

    つまり、

    from django.db.models import Sum
    
    summary = (Invoice.objects
                  .annotate(m=Month('date'))
                  .values('m')
                  .annotate(total=Sum('total'))
                  .order_by())
    

    ここで完全な要点を参照してください:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17

    さらに情報が必要な場合:

    独自のFuncクラスの作成の詳細:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions

    values()句の詳細(句の順序に関してannotate()との相互作用に注意してください):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values

    annotate()句とvalues()句がクエリに適用される順序は重要です。 values()句がannotate()の前にある場合、アノテーションは、values()句で記述されたグループ化を使用して計算されます。



    1. T-SQLで文字列の一部を置き換える方法

    2. 日付/時刻範囲を日ごとに分割するには、OracleSQLが必要です

    3. 致命的なエラー:キャッチされない例外'mysqli_sql_exception'とメッセージ'クエリ/プリペアドステートメントでインデックスが使用されていません'

    4. SQL Server(T-SQL)で文字列を別の文字列に置き換える