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

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()の計算対象となります。これにより、従来の自己結合や相関サブクエリを使わずとも、シンプルな記述でランニングトータルを実現できます。

  1. MySQLでNULL値を特定の値に置き換える方法:IFNULL()関数の使い方

    MySQLでは、IFNULL()関数を使用することで、列に含まれるNULL値を検出し、任意の特定の値に置き換えて表示することができます。この記事では、サンプルテーブルの作成からIFNULL()を使ったクエリの実行まで、具体的な手順をわかりやすく解説します。 サンプルテーブルの作成 まず、以下のコマンドでテーブルを作成しましょう。ここでは、名前を格納する「FirstName」列を持つテーブルを定義します。 mysql> create table DemoTable1878 ( FirstName varchar(20) ); Query OK, 0 rows af

  2. MySQLで1つのINSERT文を使って列に複数の値を一括挿入する方法

    はじめにMySQLでは、1つのINSERT文を繰り返し実行しなくても、単一のクエリだけで同じ列に複数の値を挿入できます。VALUES句の後ろに、挿入したい値をカンマ区切りのタプル(行)として列挙するだけです。この方法はデータベースへの接続回数を減らせるため、大量のデータを登録する際にパフォーマンス面でも大きなメリットがあります。基本構文複数の値を1つの列に挿入する場合の基本構文は以下のとおりです。INSERT INTO テーブル名 VALUES(値1),(値2),...,(値N);このように、各値を丸括弧で囲み、カンマ(,)で区切って並べることで、1回のクエリで複数行をまとめて挿入できます。実