【MySQL】同じ列の値ごとにフィールドの合計を求めるクエリの書き方
同じ列(カラム)の値を持つ複数行のフィールド値を合計したい場合、GROUP BY句を使用します。この記事では、実際にテーブルを作成し、データを挿入してから、GROUP BY句とSUM関数を組み合わせて合計を求める手順を具体的な例とともに解説します。
1. サンプルテーブルの作成
まず、テーブルを作成します。以下の例では、顧客のシリアル番号と費用を管理するテーブル「sumOfFieldsDemo」を作成しています。
mysql> create table sumOfFieldsDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientSerialNumber varchar(100),
-> ClientCost int
-> );
Query OK, 0 rows affected (0.50 sec)
2. テーブルへのデータ挿入
次に、INSERTコマンドを使ってテーブルにサンプルレコードを挿入します。ここでは、同じシリアル番号(1111、2222、3333)が複数回登場するようにデータを用意しています。
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',450);
Query OK, 1 row affected (0.16 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('2222',550);
Query OK, 1 row affected (0.15 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('3333',150);
Query OK, 1 row affected (0.64 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('3333',250);
Query OK, 1 row affected (0.12 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('2222',1000);
Query OK, 1 row affected (0.10 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',1000);
Query OK, 1 row affected (0.16 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('1111',500);
Query OK, 1 row affected (0.17 sec)
mysql> insert into sumOfFieldsDemo(ClientSerialNumber,ClientCost) values('4444',100);
Query OK, 1 row affected (0.17 sec)
3. 登録された全レコードの確認
SELECT文を実行して、テーブル内のすべてのレコードを確認してみましょう。
mysql> select * from sumOfFieldsDemo;
実行結果は以下の通りです。
+----+--------------------+------------+ | Id | ClientSerialNumber | ClientCost | +----+--------------------+------------+ | 1 | 1111 | 450 | | 2 | 2222 | 550 | | 3 | 3333 | 150 | | 4 | 3333 | 250 | | 5 | 2222 | 1000 | | 6 | 1111 | 1000 | | 7 | 1111 | 500 | | 8 | 4444 | 100 | +----+--------------------+------------+ 8 rows in set (0.00 sec)
4. GROUP BY句で同じ列値ごとの合計を求める
それでは本題です。同じ列の値(ClientSerialNumber)ごとにClientCostの合計を求めるには、GROUP BY句でシリアル番号ごとに行をグループ化し、SUM関数で合計を計算します。
mysql> select Id,ClientSerialNumber,SUM(ClientCost) AS TotalSum -> from sumOfFieldsDemo -> group by ClientSerialNumber;
実行すると、以下のように各シリアル番号ごとの合計金額が取得できます。
+----+--------------------+----------+ | Id | ClientSerialNumber | TotalSum | +----+--------------------+----------+ | 1 | 1111 | 1950 | | 2 | 2222 | 1550 | | 3 | 3333 | 400 | | 8 | 4444 | 100 | +----+--------------------+----------+ 4 rows in set (0.00 sec)
解説のポイント
- SUM(ClientCost) AS TotalSum:SUM関数でClientCost列の合計を計算し、「TotalSum」という別名を付けて結果を見やすくしています。
- group by ClientSerialNumber:シリアル番号が同じ行をひとつのグループとしてまとめ、グループ単位で集計を行います。
- 上記の例では、シリアル番号「1111」は450+1000+500=1950、「2222」は550+1000=1550、「3333」は150+250=400と正しく集計されていることがわかります。
このように、GROUP BY句とSUM関数を組み合わせることで、特定の列の値が同一である行同士をまとめて数値の合計を簡単に求めることができます。売上集計や在庫数量の集計など、実務でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。
-
MySQLで同じIDの行を合計する方法:GROUP BYとHAVING句の使い方
MySQLで同じIDを持つ複数の行の値を合計したい場合、「GROUP BY」句と「HAVING」句を組み合わせて使用します。この記事では、テーブルの作成からクエリの実行まで、手順を追ってわかりやすく解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。ここでは「id」と「price」という2つのカラムを持つシンプルなテーブルを用意します。 例 mysql> create table demo84 -> ( -> id int, -> price int -> ) -> ; Query OK,
-
MySQLで列の最大値を取得する方法をわかりやすく解説
MySQLで特定の列の最大値を取得するには、MAX(columnName)関数を使用します。本記事では、その基本的な使い方に加えて、データベースやテーブルの設計に関する前提知識もあわせて解説します。MySQLのデータベースとテーブルの基礎MySQLをインストールする前に、まず使用するバージョンと配布形式(バイナリファイルか、ソースファイルからビルドするか)を決定することが重要です。新しく作成したばかりのデータベースには、当然ながらテーブルはまだ存在しません。データベース設計において最も重要なのは、以下の要素を決めることです。データベース全体の構造必要となるテーブルの一覧各テーブルに含まれる列(