MySQLのGROUP BYで行をグループ化して集計する方法
MySQLでは、GROUP BY句を使うことで、特定のカラムの値が同じ行をまとめてグループ化し、SUM()やCOUNT()などの集計関数と組み合わせて合計値や件数を求めることができます。この記事では、実際にテーブルを作成しながら、GROUP BYの基本的な使い方を解説します。
1. サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Subject varchar(20),
Price int
);
Query OK, 0 rows affected (0.64 sec)
このテーブルは、Id(自動採番の主キー)、Subject(科目名)、Price(価格)の3つのカラムを持っています。
2. テストデータの挿入
次に、INSERT文を使ってレコードを挿入します。同じ科目のデータを複数件登録しておくことで、グループ化の効果がわかりやすくなります。
mysql> insert into DemoTable(Subject,Price) values('MySQL',456);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(Subject,Price) values('MySQL',456);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Subject,Price) values('MongoDB',56);
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(Subject,Price) values('MongoDB',60);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Subject,Price) values('Java',100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable(Subject,Price) values('Java',130);
Query OK, 1 row affected (0.15 sec)
3. 登録されたデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
出力結果
+----+---------+-------+ | Id | Subject | Price | +----+---------+-------+ | 1 | MySQL | 456 | | 2 | MySQL | 456 | | 3 | MongoDB | 56 | | 4 | MongoDB | 60 | | 5 | Java | 100 | | 6 | Java | 130 | +----+---------+-------+ 6 rows in set (0.00 sec)
各科目ごとに複数のレコードが登録されていることが確認できます。
4. GROUP BYで科目ごとの合計金額を取得する
ここからが本題です。GROUP BYを使用して、Subject(科目)ごとにPrice(価格)の合計を求めるクエリは以下の通りです。
mysql> select sum(Price) AS Total, Subject from DemoTable group by Subject;
出力結果
+-------+---------+ | Total | Subject | +-------+---------+ | 912 | MySQL | | 116 | MongoDB | | 230 | Java | +-------+---------+ 3 rows in set (0.04 sec)
SUM(Price) AS TotalのようにAS句を使うことで、集計結果のカラムに別名「Total」を付けています。実行結果を見ると、MySQLは912(456+456)、MongoDBは116(56+60)、Javaは230(100+130)と、科目ごとに価格が正しく集計されていることがわかります。
補足:GROUP BYを使う際のポイント
- SELECT句に書けるのは、GROUP BYで指定したカラムと集計関数のみです。それ以外のカラムを指定すると、意図しない結果やエラーの原因になります。
- 件数を数えたい場合は
COUNT(*)、平均値を求めたい場合はAVG()、最大値・最小値にはMAX()・MIN()など、目的に応じた集計関数を組み合わせられます。 - 集計結果に対して条件を絞り込みたい場合は、WHEREではなく
HAVING句を使用します。
このように、GROUP BYは売上集計や在庫管理など、データをカテゴリ別にまとめて分析したい場面で非常に役立つ機能です。ぜひ活用してみてください。
-
MySQLでGROUP BYのように特定の1行だけ更新する方法|ORDER BYとLIMITを活用したUPDATE文の書き方
MySQLでは、UPDATE文の中でGROUP BYを直接使用することができません。しかし、「同じ値を持つ複数のレコードの中から、最初の1行だけを更新したい」というケースは実際の開発でよく発生します。 そんなときに役立つのが、ORDER BYとLIMITを組み合わせたUPDATE文です。この記事では、サンプルテーブルを使いながら、その具体的な手順をわかりやすく解説します。 1. サンプルテーブルを作成する まず、従業員情報を格納するテーブル「DemoTable2018」を作成します。テーブルには、自動採番される主キー「EmployeeId」、従業員名「EmployeeName」、給与「Emp
-
MySQLで同じIDの行を合計する方法:GROUP BYとHAVING句の使い方
MySQLで同じIDを持つ複数の行の値を合計したい場合、「GROUP BY」句と「HAVING」句を組み合わせて使用します。この記事では、テーブルの作成からクエリの実行まで、手順を追ってわかりやすく解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。ここでは「id」と「price」という2つのカラムを持つシンプルなテーブルを用意します。 例 mysql> create table demo84 -> ( -> id int, -> price int -> ) -> ; Query OK,