SQLiteは、軽量で使いやすいデータベースとして多くのアプリケーションや学習環境で利用されています。その中でも「GROUP BY」は、データをグループ化して集計処理を行うときに欠かせない構文です。売上の合計や平均、件数のカウントなど、現実のデータ分析にも直結する便利な使い方が可能です。本記事では、SQLiteにおけるGROUP BYの基本的な使い方から、HAVINGとの組み合わせ、実践的なSQL文の例までを丁寧に解説します。SQL初心者でも安心して読めるように、わかりやすい言葉と具体例で構成しています。
GROUP BYとは何か?基本の意味と役割
SQLiteにおけるGROUP BYは、特定の列の値をもとにデータをグループ化し、各グループごとに集計を行うための構文です。
たとえば、販売データが入ったテーブルで「商品ごとの売上合計」を知りたい場合、GROUP BYを使うことで「商品ごとに」データを分けて集計が可能になります。
基本構文は以下の通りです。
SELECT カラム名, 集計関数
FROM テーブル名
GROUP BY カラム名;
使用される主な集計関数:
COUNT()
:件数を数えるSUM()
:合計を求めるAVG()
:平均を出すMAX()
:最大値MIN()
:最小値
GROUP BYの基本例:商品ごとの売上を集計する
以下のような「sales」テーブルがあるとします。
id | product | amount |
---|---|---|
1 | Apple | 100 |
2 | Banana | 200 |
3 | Apple | 150 |
4 | Banana | 100 |
5 | Orange | 300 |
このデータから商品ごとの売上合計を求めたい場合、以下のようなSQLを使います。
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product;
実行結果は以下の通りになります。
product | total_sales |
---|---|
Apple | 250 |
Banana | 300 |
Orange | 300 |
このようにGROUP BYを使うことで、重複したデータをグループ化して、合計値を求めることができます。
複数の列でGROUP BYを使う
GROUP BYは1つの列だけでなく、複数の列に対しても使用できます。たとえば「商品×日付」のように複合的にグループ化したいときに使います。
SELECT product, sale_date, SUM(amount) AS daily_sales
FROM sales
GROUP BY product, sale_date;
このように複数列を指定することで、より詳細な集計が可能になります。
HAVING句と組み合わせて絞り込む
GROUP BYで集計した結果に対して、さらに条件を付けたい場合はHAVING句
を使用します。WHERE
句とは異なり、集計後の値に条件を付けることができます。
例:売上合計が200以上の商品だけを表示
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product
HAVING total_sales >= 200;
実行結果:
product | total_sales |
---|---|
Apple | 250 |
Banana | 300 |
Orange | 300 |
このように、HAVING句を使うと、集計したあとのデータに対してさらに絞り込みができるため非常に便利です。
GROUP BYとORDER BYの併用
GROUP BYと一緒にORDER BY
を使うことで、集計結果を見やすい順番に並べることができます。
例:売上の多い順に並べたい場合
SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY product
ORDER BY total_sales DESC;
結果:
product | total_sales |
---|---|
Banana | 300 |
Orange | 300 |
Apple | 250 |
このように、ORDER BYを使うことで、データをより見やすく、意味のある順番で表示できます。
GROUP BYで注意すべきポイント
GROUP BYを使う際にはいくつかの注意点があります。
1. SELECT句にはグループ化されていない列を直接書けない
以下のようなSQLはエラーになります。
SELECT id, product, SUM(amount)
FROM sales
GROUP BY product;
id
はGROUP BYに含まれていないため、複数の行にまたがる可能性があり、どの値を表示するか曖昧になります。
正しくは以下のように集計関数を使うか、GROUP BYの対象に含める必要があります。
SELECT product, COUNT(id), SUM(amount)
FROM sales
GROUP BY product;
実践的なGROUP BYの使用例:ユーザーごとのアクティビティ集計
ユーザーテーブルとアクティビティログがあると仮定します。
-- usersテーブル
| user_id | name |
|---------|--------|
| 1 | Alice |
| 2 | Bob |
-- logsテーブル
| log_id | user_id | action |
|--------|---------|------------|
| 1 | 1 | login |
| 2 | 1 | logout |
| 3 | 2 | login |
| 4 | 1 | login |
ユーザーごとのアクション数を数えたいときは以下のようにします。
SELECT users.name, COUNT(logs.action) AS action_count
FROM users
JOIN logs ON users.user_id = logs.user_id
GROUP BY users.name;
結果:
name | action_count |
---|---|
Alice | 3 |
Bob | 1 |
JOINとGROUP BYを組み合わせることで、より実用的な集計分析が可能になります。
まとめ:GROUP BYはSQLiteでの集計分析の基本!
SQLiteにおけるGROUP BYの使い方をマスターすれば、データを「まとめて見る」力が飛躍的に向上します。売上分析、ユーザー行動の把握、カテゴリ別の統計など、様々な場面で活用できます。
要点まとめ
- GROUP BYは指定した列の値ごとに行をまとめる。
- SUM、COUNT、AVGなどの集計関数とセットで使う。
- HAVING句で集計後のデータを絞り込み可能。
- ORDER BYで見やすく並び替えができる。
- 複数列でのグループ化、JOINとの併用も実用的。
実際に手を動かしてSQLを書いてみることで、GROUP BYの理解は一段と深まります。ぜひ自分のデータで試してみてください。