複数列と式でグループ化する
複合グループ化キーと、計算値によるグループ化を学びます。
「複数列と式でグループ化する」はCoddyKit上の無料SQL Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Interview Prepコースには全4レッスンが含まれています。
単一のグループ化キーを超えて
実際のレポートで、1列だけでグループ化することはほとんどありません。面接官は「地域ごとの売上」から「地域ごと・月ごとの売上」へと質問を発展させ、複合グループ化キーを理解しているか確認します。
ルールはそのまま適用できます。GROUP BYに列を追加すると、それらの列の異なる組み合わせごとに1行が作られます。
複数の列が意味すること
GROUP BY region, productと記述すると、グループキーは(region, product)という組になります。固有の組ごとに1つの出力行が作られます。
- 地域が5つ、商品が4つある場合、グループ数は最大20になります。
- 実際には存在しない組み合わせについては、行はまったく生成されません。
- GROUP BYでの列の順序は結果セットを変えず、実行計画に影響する場合があるだけです。
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY region, product;SELECTのルールは変わらない
基本的な制約は緩和されません。集約されていないSELECTの列はすべてGROUP BYに含める必要があります。複合キーの場合は、それらをすべて列挙するだけです。
複数キーのグループで列を1つ書き忘れるのは、面接のプレッシャー下で最もよくあるミスです。GROUP BYの一覧を、集約されていないSELECTの列と正確に一致させてください。
-- Both region and product appear in GROUP BY
SELECT region, product,
COUNT(*) AS orders,
AVG(amount) AS avg_amount
FROM sales
GROUP BY region, product;式によるグループ化
生の列だけでなく、計算した値でもグループ化できます。よくある例は月ごとの売上で、日付を切り捨てたり、日付から月を取り出したりした式でグループ化します。
GROUP BYの式はSELECTの式と一致していなければなりません。エンジンは計算結果を基準にグループ化します。
SELECT DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS monthly_total
FROM sales
GROUP BY DATE_TRUNC('month', order_date);CASEによる区分化
強力なパターンとして、CASE式でグループ化し、独自の区分を作成できます。これは、参照テーブルなしで「小・中・大の注文」の集計を作成する方法です。
この方法は、CASEのロジックと派生値によるグループ化を同時に確認できるため、面接官に好まれます。
SELECT CASE
WHEN amount < 50 THEN 'small'
WHEN amount < 200 THEN 'medium'
ELSE 'large'
END AS bucket,
COUNT(*) AS orders
FROM sales
GROUP BY CASE
WHEN amount < 50 THEN 'small'
WHEN amount < 200 THEN 'medium'
ELSE 'large'
END;列の位置によるグループ化
多くの方言では、列の順序番号でグループ化できます。GROUP BY 1, 2は、SELECTの1列目と2列目を意味します。簡潔ですが、壊れやすい書き方です。
面接官が受け入れることもありますが、リスクを指摘してください。SELECTの一覧の順序を変えるだけで、グループ化が黙って変わります。本番コードでは、明示的な式を優先しましょう。
-- 1 = month expression, 2 = region
SELECT DATE_TRUNC('month', order_date) AS month,
region, SUM(amount)
FROM sales
GROUP BY 1, 2;NULLは独自のグループを作る
グループ化におけるNULL処理の注意点です。グループ化列にNULLが含まれている場合、すべてのNULL行が1つのグループにまとめられます。
これは、NULLがNULLと等しくならない等価比較とは異なります。グループ化では、NULLは「同じもの」として扱われ、1つの区分を形成します。この一見矛盾した動作は、面接官が好んで出す質問です。
-- Rows with region IS NULL all land in one group
SELECT region, COUNT(*) AS orders
FROM sales
GROUP BY region;複数のレベルにGROUPING SETSを使う
1つのクエリで複数の粒度の集計結果を作成するには、GROUPING SETSを使います。指定した各キーの集合を計算し、その結果を結合します。
これは中級から上級レベルの理解を示すポイントです。3つのクエリとUNIONを使う代わりに、1つの文で地域ごと、商品ごと、全体の合計をまとめて返せます。
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS ((region), (product), ());ROLLUPとCUBE
ROLLUPとCUBEは、よく使うGROUPING SETSの省略記法です。ROLLUP(region, product)を使うと、地域と商品の組み合わせ、地域ごとの小計、全体の合計が得られ、階層型のレポートに適しています。
CUBEは、指定した列のあらゆる組み合わせを生成します。これらを知っていると、実際のレポート用クエリを作成した経験がある候補者だと示せます。
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP (region, product);例題:月別地域レポート
ここまでの考え方を組み合わせ、完了した注文だけを対象に、地域ごと・月ごとの売上合計と平均を求め、読みやすい順序で並べます。
まずWHEREで行を絞り込み、複合キーで地域と月の式を基準にグループ化し、ORDER BYで出力を整えます。これは、アナリスト職の面接でよくある総合的な回答です。
SELECT region,
DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS total,
AVG(amount) AS avg_order
FROM sales
WHERE status = 'completed'
GROUP BY region, DATE_TRUNC('month', order_date)
ORDER BY region, month;声に出して考える方法
複合グループ化に関する質問では、キーを明確に説明しましょう。「XとYの組み合わせでグループ化するため、異なる(X, Y)の組ごとに1行が得られます」。
次に、集約されていないSELECTの各列がそのキーに含まれていることを確認し、NULLは1つのグループにまとまることにも触れます。このように手順を追って説明する姿勢が、中級レベルの面接で評価されます。
クイックチェック
複合グループ化キーについて考えてみましょう。
まとめ
複合キー:複数の列を列挙すると、異なる組み合わせごとに1行が生成されます。集約されていないSELECTの列はすべてキーに含める必要があります。
- 式、CASEによる区分、列の順序番号でグループ化できます。ただし、順序番号は壊れやすい書き方です。
- グループ化列のNULLは1つのグループにまとまります。
GROUPING SETS、ROLLUP、CUBEを使うと、1つのクエリで複数のグループ化レベルを生成できます。- 行の絞り込みはグループ化の前にWHEREへ移します。
よくある質問
「複数列と式でグループ化する」レッスンは無料ですか?
はい。「複数列と式でグループ化する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Interview Prepコースには全4レッスンが含まれています。
「複数列と式でグループ化する」で何を学びますか?
複合グループ化キーと、計算値によるグループ化を学びます。 ブラウザで直接実行するハンズオンコードでSQL Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「複数列と式でグループ化する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのSQL Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。