Case/Whenによる条件付き集計
1つのクエリ内で分岐処理を行います
「Case/Whenによる条件付き集計」はCoddyKit上の無料Django Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDjango Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Django Academyコースには全4レッスンが含まれています。
クエリ内で分岐する
行ごとに異なる結果が必要になることがあります。Caseを使うと、SQLのif文のように、データベースが行ごとに値を選択できます。
CaseとWhenの組み合わせ
Caseは1つ以上のWhen分岐を保持します。各Whenは条件と、その条件が真の場合に使用する値を組み合わせたものです。
from django.db.models import Case, When, Value単純なラベル
各Whenに条件とthenの値を指定し、残りの場合のdefaultを設定すると、計算されたラベルをannotateできます。
Book.objects.annotate(tier=Case(
When(price__gte=50, then=Value("premium")),
default=Value("standard")))条件付き集計の理由
本当の力は、Caseを集計の内部に置くことで発揮されます。これにより、条件に一致する行だけをカウントまたは合計できます。
条件に一致する行を数える
CaseをCountで包むと、一致する行だけを数えられます。一致しない分岐はnullを返し、除外されるためです。
Count(Case(When(active=True, then=1)))filter=のショートカット
最新のDjangoでは、より簡潔な方法があります。集計にfilterを渡すと、自分でCaseを書かずに一部の行をカウントまたは合計できます。
Count("id", filter=Q(active=True))複数の分類を一度に作る
複数の条件付き集計をまとめてannotateすると、1回のクエリで有効・無効の件数のような内訳を作成できます。
Team.objects.annotate(
active=Count("member", filter=Q(member__active=True)),
inactive=Count("member", filter=Q(member__active=False)))一部の行を合計する
同じ方法はSumにも使えます。支払い済みの請求書など、条件を満たす行だけを合計できます。
Sum("amount", filter=Q(status="paid"))output_fieldを設定する
値の型が明確でない場合は、Caseにoutput_fieldを指定して、Djangoが結果を処理する方法を把握できるようにします。
Case(When(...), default=Value(0), output_field=IntegerField())Caseで並べ替える
Caseのannotateに対してorder_byを使い、通常のフィールド順では表現できないカスタムの並べ替え優先順位を作ることもできます。
データベースへのアクセスは1回
この分岐処理はすべて1つのクエリでサーバー側にて実行されるため、Pythonでループして手作業で数えるよりはるかに高速です。
簡単な確認
チームのメンバーのうち、有効なメンバーが何人いるかをデータベースで計算し、1つの数値として取得したいとします。
まとめ
CaseとWhenは行ごとの分岐を追加します。条件と集計を組み合わせるか、filter=のショートカットを使うことで、1つのクエリで豊富な内訳を作成できます。📊
AI チューターと学ぶ Python — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 30
- レッスン
- 120
よくある質問
「Case/Whenによる条件付き集計」レッスンは無料ですか?
はい。「Case/Whenによる条件付き集計」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Django Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Django Academyコースには全4レッスンが含まれています。
「Case/Whenによる条件付き集計」で何を学びますか?
1つのクエリ内で分岐処理を行います ブラウザで直接実行するハンズオンコードでDjango Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Django Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDjango Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Case/Whenによる条件付き集計」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDjango Academyレッスンでコードを書いて実行できますか?
はい。すべてのDjango Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- aggregateとannotate
- Atomic UpdateのためのF Expressions
- 複雑なフィルターのためのQ Objects
- Case/Whenによる条件付き集計