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の理解は一段と深まります。ぜひ自分のデータで試してみてください。

