Django で GROUP BY としてクエリを実行する
あなたのほとんどは SQL に精通しており、GROUP BY 句を使用してグループ内のデータを取得する SQL クエリを作成する方法を知っています。 GROUP BY 句を使用すると、単一列または複数列の値に基づいてレコードのグループを作成し、集計関数を実行できます。
この記事では、Bike_id、Bike_name、Bike_brand、Bike_color、Bike_bought_date、Is_bike_premium、Bike_price などを含む Bike データベースで作業していると想定します。 .
上記の Bike データベースで GROUP BY 句を使用してさまざまな操作を実行する方法を学習します。 また、最初に GROUP BY 句を使用して SQL クエリを作成し、それを Python に変換して、読者が簡単に理解し、Django でのクエリの作成方法をすばやく学習できるようにします。
Django で GROUP BY クエリを作成する
色に応じて自転車の数を数えたいとします。 簡単に言えば、色に応じて自転車のグループを作成したいので、以下の SQL クエリを作成しました。
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes
FROM
Bike
GROUP BY
Bike_color
上記の SQL クエリの出力として、2つの列が得られます。 1つは Bike_color で、もう 1つは Total_Bikes で、特定の色の自転車の数を表します。
ここで、上記の SQL クエリを Python コードに変換して、同じ結果を取得します。
from django.db.models import Count
Bike.objects.values("Bike_color").annotate(Total_bikes=Count("Bike_id"))
出力:

values()- SQL クエリのGROUP BY句を置き換えます。values()メソッドの引数として使用する必要がある SQL クエリのGROUP BY句で使用している列。annotate()-annotate()メソッドは、集約関数を引数として取り、すべてのグループに適用します。
このようにして、色に応じて自転車のグループを作成し、Python クエリを使用して同じ色の自転車の数を数えることができます。
ユーザーが values() の前に annotate() 関数を呼び出すと、グループの行ではなくレコード全体に集計関数が適用されます。 そのため、クエリの作成中に使用するメソッドの順序を確認してください。
GROUP BY クエリで複数の集計を使用する
ここでは、色ごとにバイクのグループを作成します。 その後、Count() 集計関数を使用してすべての色の自転車を数え、Min() 集計関数を使用してすべてのグループから最小コストの自転車を取得します。
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes,
MIN(Bike_price) As cheap_bike
FROM
Bike
GROUP BY
Bike_color
以下では、上記の SQL クエリを Python コードに変換しています。
from django.db.models import Count
from django.db.models import Min
Bike.objects.values("Bike_color").annotate(
Total_bikes=Count("Bike_id"), cheap_bike=Min("Bike_price")
)
出力:

このように、Python の group by クエリで Count() および Min() 複数の集計関数を使用しました。
複数の列を持つGROUP BYレコード
以下の SQL クエリでは、Bike_color フィールドと Is_bike_premium フィールドを GROUP BY 句と共に使用しています。 クエリは、色とプレミアム カテゴリに属しているかどうかに従って、レコードをグループ化します。
SELECT
Bike_color,
Is_bike_premium,
COUNT(Bike_id) AS Total_bikes,
FROM
Bike
GROUP BY
Bike_color,
Is_bike_premium
上記の SQL クエリを Python コードに変換するには、values() メソッド内に複数のフィールドを追加する必要があります。
from django.db.models import Count
Bike.objects.values("Bike_color", "Is_bike_premium").annotate(
Total_bikes=Count("Bike_id")
)
出力:

すべてのグループからレコードをフィルター処理する
このセクションでは、Bike テーブルのすべてのレコードのグループをその色に従って作成し、すべての非プレミアム バイクをすべてのグループからフィルタリングします。 簡単に言えば、色に応じて非プレミアムバイクのグループを作成します。
以下の SQL クエリで WHERE 句を使用してバイクをフィルター処理しました。
SELECT
Bike_color,
COUNT(Bike_id) AS Total_bikes
FROM
Bike
WHERE
Is_bike_premium = False
GROUP BY
Bike_color
上記の SQL クエリを Python コードに変換するには、Python の filter() メソッドを使用し、フィルター条件を引数として渡します。
from django.db.models import Count
Bike.objects.values("Bike_color").filter(Is_bike_premium=False).annotate(
Total_bikes=Count("Bike_id")
)
出力:

この記事では、Django で GROUP BY クエリを作成する方法を学びました。 また、group by クエリのさまざまな使用例を見てきました。
また、ユーザーは orderBy() メソッドで group by クエリを使用して、すべてのグループのレコードを並べ替えることができます。
