MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで累積合計(累計)列を作成する方法をわかりやすく解説

MySQLで累積合計(累計)列を作成する方法

MySQLで累積合計(累計)列を作成するには、ユーザー定義変数を作成し、初期値を0に設定するのが基本的な手法です。累積合計とは、各行の値に対して、それまでの行の値を順番に加算していった結果のことです。

本記事では、変数を使った伝統的な方法と、MySQL 8.0以降で利用できるウィンドウ関数を使ったモダンな方法の両方を、実際のコード例とともに解説します。

1. ユーザー定義変数を使った累積合計列の作成

まず、SET文を使って変数を作成し、初期化します。構文は以下の通りです。

SET @anyVariableName := 0;

続いて、SELECT文の中でこの変数を利用し、累積合計列を生成します。基本構文は以下の通りです。

SELECT yourColumnName1, yourColumnName2, ...N,
       (@anyVariableName := @anyVariableName + yourColumnName2) AS anyVariableName
FROM yourTableName
ORDER BY yourColumnName1;

サンプルテーブルの作成

ここまでの内容を理解するために、実際にサンプルテーブルを作成してみましょう。テーブル作成のクエリは以下の通りです。

mysql> CREATE TABLE CumulativeSumDemo
    -> (
    -> BookId int,
    -> BookPrice int
    -> );
Query OK, 0 rows affected (0.67 sec)

サンプルデータの挿入

次に、INSERT文を使ってテーブルにレコードを挿入します。各書籍のIDと価格のデータを登録していきましょう。

mysql> INSERT INTO CumulativeSumDemo VALUES(101,400);
Query OK, 1 row affected (0.15 sec)

mysql> INSERT INTO CumulativeSumDemo VALUES(102,500);
Query OK, 1 row affected (0.16 sec)

mysql> INSERT INTO CumulativeSumDemo VALUES(103,600);
Query OK, 1 row affected (0.16 sec)

mysql> INSERT INTO CumulativeSumDemo VALUES(104,1000);
Query OK, 1 row affected (0.18 sec)

登録データの確認

挿入した全レコードをSELECT文で表示してみます。

mysql> SELECT * FROM CumulativeSumDemo;

実行結果は以下の通りです。

+--------+-----------+
| BookId | BookPrice |
+--------+-----------+
|    101 |       400 |
|    102 |       500 |
|    103 |       600 |
|    104 |      1000 |
+--------+-----------+
4 rows in set (0.00 sec)

変数を初期化して累積合計を求める

累積合計列を追加する前に、まず変数を作成して初期化します。

mysql> SET @CumulativeSum := 0;
Query OK, 0 rows affected (0.00 sec)

その後、冒頭で説明した構文を実装し、累積合計列を追加した結果を取得します。

mysql> SELECT BookId, BookPrice,
    ->        (@CumulativeSum := @CumulativeSum + BookPrice) AS CumSum
    -> FROM CumulativeSumDemo ORDER BY BookId;

実行結果は以下の通りです。右端に累積合計列(CumSum)が追加されていることが確認できます。

+--------+-----------+--------+
| BookId | BookPrice | CumSum |
+--------+-----------+--------+
|    101 |       400 |    400 |
|    102 |       500 |    900 |
|    103 |       600 |   1500 |
|    104 |      1000 |   2500 |
+--------+-----------+--------+
4 rows in set (0.00 sec)

このように、BookPriceの値が上から順番に加算され、400 → 900 → 1500 → 2500 という累積合計が計算されています。

2. ウィンドウ関数を使う方法(MySQL 8.0以降で推奨)

MySQL 8.0以降では、ウィンドウ関数 SUM() OVER() を使うことで、変数を用意することなく、よりシンプルかつ安全に累積合計を計算できます。

SELECT BookId, BookPrice,
       SUM(BookPrice) OVER (ORDER BY BookId) AS CumSum
FROM CumulativeSumDemo;

実行結果は、先ほどの変数を使った方法と同じになります。ORDER BY句で並び替えの基準となる列を指定すると、その順序に従って累積合計が計算されます。

まとめ

  • MySQL 5.x以前や古い環境では、ユーザー定義変数(@変数)を使った方法で累積合計列を作成できます。
  • MySQL 8.0以降では、ウィンドウ関数 SUM() OVER() を使う方法が標準的で、パフォーマンス・可読性・保守性の面でも優れています。
  • 変数を使う方法は実行順序に依存するため、意図しない結果になる可能性があります。新規開発ではウィンドウ関数の利用を検討しましょう。
  1. MySQLでビュー(VIEW)を作成する方法|CREATE VIEWの基本構文と実行例を解説

    MySQLのビュー(VIEW)とは?ビュー(VIEW)とは、SQLクエリの結果セットをもとに定義される「仮想テーブル」のことです。実際のデータを物理的に保存するわけではなく、元のテーブルへの参照情報のみを保持します。そのため、複雑なクエリをシンプルな名前で呼び出せるようにしたり、ユーザーに見せたい列や行だけを限定して提供したりする際に非常に便利です。MySQLでビューを作成するには、CREATE VIEW文を使用します。ビュー作成の基本構文ビューを作成するための基本構文は以下の通りです。create view yourViewName as select * from yourTableNam

  2. MySQLでシーケンスを作成する方法|AUTO_INCREMENTの使い方とルールを解説

    MySQLにおけるシーケンスとは?MySQLにおける「シーケンス」とは、1(指定した場合は0)から始まり、昇順で自動生成される整数の連番のことです。多くのアプリケーションでは、レコードを一意に識別するための番号を発行する目的でシーケンスが利用されています。具体例代表的な例としては、CRMシステムの顧客ID、人事管理システムの社員番号、設備管理システムの機器番号などが挙げられます。MySQLでシーケンスを自動的に作成するには、対象のカラムにAUTO_INCREMENT属性を設定します。通常は、主キー(PRIMARY KEY)カラムに対して適用するのが一般的です。AUTO_INCREMENTを使用