Django で GROUP BY としてクエリを実行する

Shubham Vora 2023年6月20日
  1. Django で GROUP BY クエリを作成する
  2. GROUP BY クエリで複数の集計を使用する
  3. 複数の列を持つGROUP BYレコード
  4. すべてのグループからレコードをフィルター処理する
Django で GROUP BY としてクエリを実行する

あなたのほとんどは SQL に精通しており、GROUP BY 句を使用してグループ内のデータを取得する SQL クエリを作成する方法を知っています。 GROUP BY 句を使用すると、単一列または複数列の値に基づいてレコードのグループを作成し、集計関数を実行できます。

この記事では、Bike_idBike_nameBike_brandBike_colorBike_bought_dateIs_bike_premiumBike_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"))

出力:

django groupby を作成

  1. values() - SQL クエリの GROUP BY 句を置き換えます。 values() メソッドの引数として使用する必要がある SQL クエリの GROUP BY 句で使用している列。
  2. 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")
)

出力:

django groupby multiple

このように、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")
)

出力:

django groupby multiple columns

すべてのグループからレコードをフィルター処理する

このセクションでは、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 groupby filter

この記事では、Django で GROUP BY クエリを作成する方法を学びました。 また、group by クエリのさまざまな使用例を見てきました。

また、ユーザーは orderBy() メソッドで group by クエリを使用して、すべてのグループのレコードを並べ替えることができます。

著者: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub

関連記事 - Django SQL