単一列・複数列のGROUP BY
1つ以上の列で行をグループ化して小計やカテゴリ別の内訳を作成し、GROUP BYクエリの実行計画を読み取ります。
「単一列・複数列のGROUP BY」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
GROUP BYの役割
GROUP BYは、1つ以上の列の値に基づいて行をグループに分け、そのグループごとに集約関数を適用します。
単一列によるグループ化
ユーザーごとの注文総数:
SELECT user_id, COUNT(*) AS order_count, SUM(total) AS revenue
FROM orders
GROUP BY user_id
ORDER BY revenue DESC;複数列によるグループ化
カテゴリと国によるサブグループ:
SELECT country, category, SUM(total) AS revenue
FROM orders o
JOIN products p ON p.id = o.product_id
JOIN users u ON u.id = o.user_id
GROUP BY country, category
ORDER BY country, revenue DESC;SELECTで指定するすべての列はグループ化または集約が必要
標準SQLのルール:
-- WRONG — email is neither grouped nor aggregated:
SELECT user_id, email, COUNT(*)
FROM orders
GROUP BY user_id; -- ERROR
-- RIGHT — group by both, or use an aggregate:
SELECT user_id, MAX(email) AS email, COUNT(*)
FROM orders
GROUP BY user_id;式によるGROUP BY
式の結果(例:月単位の区分)でグループ化します:
SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY date_trunc('month', created_at)
ORDER BY month;位置またはエイリアスによるGROUP BY
SELECTリストの位置またはエイリアスでグループ化できます(PostgreSQL):
SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
GROUP BY month -- alias
ORDER BY 1; -- positionGrouping Sets、ROLLUP、CUBE
1つのクエリで複数のグループ化を計算できます。小計の作成に最適です:
SELECT country, category, SUM(total)
FROM orders o JOIN ...
GROUP BY ROLLUP (country, category);
-- Returns: per (country, category), per country, grand total空のグループは存在しない
GROUP BYは、少なくとも1行が存在するグループだけを返します。注文数が0のカテゴリも含め、すべてのカテゴリを取得したい場合は、マスターリストからLEFT JOINして集約します。
GROUP BYとインデックス
プランナーは、ハッシュ集約(グループのハッシュテーブルを作成)またはソートしてからグループ化する方法を使用することがあります。グループ化する列にインデックスがあると、後者の方法を高速化できます。
ウィンドウ関数とGROUP BY
GROUP BYは行をまとめます。ウィンドウ関数はすべての行を保持したまま、集約列を追加します。適切な方法を選択してください。詳しくは「ウィンドウ関数の詳細」で説明します。
HAVINGとWHEREにおけるエイリアス
論理的な順序は FROM → WHERE → GROUP BY → HAVING → SELECT です。WHEREから集約結果は参照できませんが、HAVINGからは参照できます。
まとめ
GROUP BYはレポート作成の主役です。
- SELECTで指定するすべての列は、グループ化するか集約する必要があります
- 列、式、またはエイリアスでグループ化します
- クロス集計にはROLLUP/CUBE/GROUPING SETSを使用します
確認問題
GROUP BY countryクエリで、SELECTリストに、集約もグループ化もされていないcity列を含めることはできますか?
よくある質問
「単一列・複数列のGROUP BY」レッスンは無料ですか?
はい。「単一列・複数列のGROUP BY」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「単一列・複数列のGROUP BY」で何を学びますか?
1つ以上の列で行をグループ化して小計やカテゴリ別の内訳を作成し、GROUP BYクエリの実行計画を読み取ります。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「単一列・複数列のGROUP BY」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- COUNT、SUM、AVG、MIN、MAX
- 単一列・複数列のGROUP BY
- HAVINGとWHEREの違い
- よくある落とし穴:集約におけるNULL