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
クエリを使用して、すべてのグループのレコードを並べ替えることができます。