MySQLで重複する値ごとのレコードを別の列に合計して表示する方法
MySQLでは、重複している値(同じ名前など)を持つ複数のレコードの数値を、名前ごとにまとめて合計したいケースがあります。このような場合には、集計関数SUM()とGROUP BY句を組み合わせることで簡単に実現できます。
本記事では、実際にサンプルテーブルを作成し、重複する値を持つレコードを別の列(合計列)として集計・表示する手順を解説します。
1. サンプルテーブルを作成する
まず、CREATE TABLE文を使ってテーブルを作成します。
mysql> create table DemoTable
-> (
-> Name varchar(20),
-> Value int
-> );
Query OK, 0 rows affected (2.08 sec)
2. テーブルにレコードを挿入する
次に、INSERTコマンドを使ってテーブルにデータを追加します。ここでは「Chris」「David」「Bob」の3人の名前に対して、意図的に重複したレコードを挿入しています。
mysql> insert into DemoTable values('Chris',50);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('David',90);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Chris',60);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('Bob',100);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('David',80);
Query OK, 1 row affected (0.21 sec)3. テーブルの全レコードを確認する
SELECT文を実行して、挿入されたすべてのレコードを確認してみましょう。
mysql> select * from DemoTable;
上記のクエリを実行すると、以下のような結果が出力されます。
+-------+-------+
| Name | Value |
+-------+-------+
| Chris | 50 |
| David | 90 |
| Chris | 60 |
| Bob | 100 |
| David | 80 |
+-------+-------+
5 rows in set (0.00 sec)
このように、「Chris」と「David」にはそれぞれ2件ずつのレコードが存在していることがわかります。
4. 重複する値ごとに合計を求めるクエリ
それでは本題です。GROUP BY句でName列をグループ化し、SUM()関数でValue列の合計を求めることで、重複する値を持つレコードを別の列(合計列)として表示できます。
mysql> select Name,sum(Value) as GrandTotal from DemoTable group by Name;
実行結果は以下の通りです。
+-------+------------+
| Name | GrandTotal |
+-------+------------+
| Chris | 110 |
| David | 170 |
| Bob | 100 |
+-------+------------+
3 rows in set (0.03 sec)
結果のポイント
- Chris:50 + 60 = 110
- David:90 + 80 = 170
- Bob:単一レコードのため 100
AS句を使って「GrandTotal」という別名を付けることで、出力結果の列名がわかりやすくなります。このように、SUM()関数とGROUP BY句を組み合わせれば、重複データを効率的に集計することが可能です。売上データやアクセスログの集計など、実務でも頻繁に活用されるテクニックなので、ぜひ覚えておきましょう。
-
MySQLでGROUP BYとMIN()を使い、重複する値を持つ列ごとにタイムスタンプから最初の日付を取得する方法
このようなケースでは、集計関数 MIN() と GROUP BY 句を組み合わせることで簡単に実現できます。まずはサンプル用のテーブルを作成しましょう。mysql> create table DemoTable1870 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Value int, ShippingTimestamp varchar(100) ); Query OK, 0 rows affected (0.00 sec)次に、INSERTコマンドを使ってテーブルにレコードを挿入します。ここでは、同じ
-
MySQLで重複するIDごとに最小値を取得する方法|MIN関数とGROUP BYの実例解説
MySQLでは、重複するIDが存在するテーブルから各IDに対応する列の最小値を取得したいケースがよくあります。例えば、同じ商品IDに対して複数の価格(float型)が登録されている場合などです。そんなときは、GROUP BY句とMIN()関数を組み合わせることで簡単に実現できます。基本構文重複IDごとの最小値を取得するには、以下のような構文を使用します。select min(対象カラム名) from テーブル名 group by グループ化するカラム名;サンプルテーブルの作成実際に動作を確認するため、まずはテーブルを作成しましょう。mysql> create table DemoTabl