MySQLで累積(累計・実行合計)列を選択する方法
MySQLでデータの累積値(実行合計・累計)を含む列を選択したいケースは多くあります。例えば、売上の累計や在庫の残高計算などが代表例です。この記事では、ユーザー定義変数を使って累積列を取得する方法を、実際にデモテーブルを作成しながら順を追って解説します。
1. デモテーブルの作成
まず、動作確認用のサンプルテーブルを作成します。テーブル作成のクエリは以下のとおりです。
mysql> create table accumulatedDemo
-> (
-> Value int
-> );
Query OK, 0 rows affected (0.58 sec)
2. サンプルデータの挿入
次に、INSERT文を使ってテーブルにレコードを挿入していきます。
mysql> insert into accumulatedDemo values(10); Query OK, 1 row affected (0.21 sec) mysql> insert into accumulatedDemo values(15); Query OK, 1 row affected (0.09 sec) mysql> insert into accumulatedDemo values(20); Query OK, 1 row affected (0.13 sec) mysql> insert into accumulatedDemo values(25); Query OK, 1 row affected (0.12 sec) mysql> insert into accumulatedDemo values(45); Query OK, 1 row affected (0.14 sec)
3. テーブル内の全レコードを確認
SELECT文でテーブル内のすべてのレコードを表示して、データが正しく登録されているか確認しましょう。
mysql> select *from accumulatedDemo;
実行結果は以下のとおりです。
+-------+ | Value | +-------+ | 10 | | 15 | | 20 | | 25 | | 45 | +-------+ 5 rows in set (0.00 sec)
4. 累積列を選択するクエリ
累積列を取得するには、ユーザー定義変数(@previousSum)を利用します。まず変数を0で初期化し、SELECT文の中で各行ごとに前回までの合計値に現在の値を加算していきます。
mysql> set @previousSum = 0; Query OK, 0 rows affected (0.00 sec) mysql> select Value, @previousSum := @previousSum + Value AS AccumulatedColumn from accumulatedDemo;
実行結果は以下のとおりです。各行の「AccumulatedColumn」には、その行までの合計値が表示されていることがわかります。
+-------+-------------------+ | Value | AccumulatedColumn | +-------+-------------------+ | 10 | 10 | | 15 | 25 | | 20 | 45 | | 25 | 70 | | 45 | 115 | +-------+-------------------+ 5 rows in set (0.00 sec)
補足:MySQL 8.0以降ならウィンドウ関数がおすすめ
上記のユーザー定義変数を使う方法は従来から広く使われていますが、MySQL 8.0以降ではウィンドウ関数 SUM() OVER() を使うことで、よりシンプルかつ標準的なSQLで累積列を取得できます。
mysql> SELECT Value,
-> SUM(Value) OVER (ORDER BY Value) AS AccumulatedColumn
-> FROM accumulatedDemo;
ウィンドウ関数の方が可読性が高く、パフォーマンス面でも有利なため、新しいバージョンのMySQLを使用している場合はこちらの方法を採用するのがおすすめです。
-
MySQLで条件に基づいて列の値を合計する方法(SUM句とWHERE句の使い方)
MySQLでは、SUM()関数とWHERE句を組み合わせることで、特定の条件を満たすレコードだけを対象に列の合計値を簡単に求めることができます。本記事では、実際にテーブルを作成し、データを挿入してから、条件に基づいた合計を取得する手順を詳しく解説します。 1. テーブルの作成 まず、サンプル用のテーブルを作成します。以下のコマンドを実行してください。 mysql> create table DemoTable ( CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY, ProductAmount int, Custo
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec