MySQLでSUM()とOVER句を使って単一列の値を累積合計する方法
MySQLでは、集計関数SUM()をOVER句と組み合わせることで、単一の列の値を行順に沿って合計した「累積合計(ランニングトータル)」を簡単に求めることができます。なお、ウィンドウ関数であるOVER句はMySQL 8.0以降で利用可能です。
ここでは、サンプルテーブルを作成し、特定の順序で列の値を合計する手順を具体的に見ていきましょう。
1. サンプルテーブルの作成
まず、以下のようにCREATE TABLE文でテーブルを作成します。
mysql> create table DemoTable
(
CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
CustomerValue int
);
Query OK, 0 rows affected (0.64 sec)2. レコードの挿入
続いて、INSERTコマンドを使っていくつかのレコードを挿入します。
mysql> insert into DemoTable(CustomerValue) values(10); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable(CustomerValue) values(20); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable(CustomerValue) values(30); Query OK, 1 row affected (0.23 sec) mysql> insert into DemoTable(CustomerValue) values(40); Query OK, 1 row affected (0.14 sec)
3. テーブルの内容を確認
SELECT文でテーブル内のすべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
上記のクエリを実行すると、次のような結果が出力されます。
+------------+---------------+ | CustomerId | CustomerValue | +------------+---------------+ | 1 | 10 | | 2 | 20 | | 3 | 30 | | 4 | 40 | +------------+---------------+ 4 rows in set (0.00 sec)
4. 特定の順序で値を合計するクエリ
ここが本題です。次のクエリでは、SUM()にOVER (ORDER BY CustomerId)を組み合わせることで、CustomerIdの順序に従ってCustomerValueの累積合計を各行に表示しています。
mysql> select CustomerId,
SUM(CustomerValue) OVER (ORDER BY CustomerId) SpecificSum from DemoTable;実行結果
上記のクエリを実行すると、次のような結果が得られます。
+------------+-------------+ | CustomerId | SpecificSum | +------------+-------------+ | 1 | 10 | | 2 | 30 | | 3 | 60 | | 4 | 100 | +------------+-------------+ 4 rows in set (0.00 sec)
結果のポイント
出力結果を見ると、SpecificSum列には以下のように累積合計が格納されています。
- 1行目:10(10)
- 2行目:30(10 + 20)
- 3行目:60(10 + 20 + 30)
- 4行目:100(10 + 20 + 30 + 40)
このようにOVER (ORDER BY ...)を指定すると、ORDER BYで指定した列の順序に基づいて、現在行までのレコードがSUM()の計算対象となります。これにより、従来の自己結合や相関サブクエリを使わずとも、シンプルな記述でランニングトータルを実現できます。
-
MySQLでNULL値を特定の値に置き換える方法:IFNULL()関数の使い方
MySQLでは、IFNULL()関数を使用することで、列に含まれるNULL値を検出し、任意の特定の値に置き換えて表示することができます。この記事では、サンプルテーブルの作成からIFNULL()を使ったクエリの実行まで、具体的な手順をわかりやすく解説します。 サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成しましょう。ここでは、名前を格納する「FirstName」列を持つテーブルを定義します。 mysql> create table DemoTable1878 ( FirstName varchar(20) ); Query OK, 0 rows af
-
MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法
はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実