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

【MySQL】IF条件とストアドプロシージャを組み合わせたSUM(合計)クエリの実装方法

はじめに:MySQLのSUM()関数とIF条件

SUM()はMySQLを代表する集計関数の一つです。通常は指定したカラム全体の合計を算出しますが、IF()条件と組み合わせることで、「特定の条件に一致する行だけ」を対象とした合計値を柔軟に求めることができます。

さらに、この処理をストアドプロシージャとして登録しておけば、引数を渡すだけで繰り返し利用できる便利な集計処理になります。本記事では、テーブルの作成からストアドプロシージャの定義・呼び出しまで、手順を追って解説します。

ステップ1:サンプルテーブルの作成

まず、IF条件付きSUMクエリの動作を確認するためのテーブルを作成しましょう。ここでは「支払い方法」と「金額」を持つシンプルなテーブルを用意します。

mysql> create table SumWithIfCondition
   -> (
   -> ModeOfPayment varchar(100)
   -> ,
   -> Amount int
   -> );
Query OK, 0 rows affected (1.60 sec)

ステップ2:テストデータの挿入

続いて、INSERTコマンドを使ってテーブルにレコードを追加していきます。「Offline(オフライン決済)」と「Online(オンライン決済)」の2種類の支払い方法に対して、それぞれ複数の金額を登録します。

mysql> insert into SumWithIfCondition values('Offline',10);
Query OK, 1 row affected (0.21 sec)

mysql> insert into SumWithIfCondition values('Online',100);
Query OK, 1 row affected (0.16 sec)

mysql> insert into SumWithIfCondition values('Offline',20);
Query OK, 1 row affected (0.13 sec)

mysql> insert into SumWithIfCondition values('Online',200);
Query OK, 1 row affected (0.16 sec)

mysql> insert into SumWithIfCondition values('Offline',30);
Query OK, 1 row affected (0.11 sec)

mysql> insert into SumWithIfCondition values('Online',300);
Query OK, 1 row affected (0.17 sec)

ステップ3:登録データの確認

SELECT文を実行して、テーブル内の全レコードを表示してみましょう。

mysql> select *from SumWithIfCondition;

実行結果は以下の通りです。Offlineの合計は10+20+30=60、Onlineの合計は100+200+300=600になることが、この時点で確認できます。

+---------------+--------+
| ModeOfPayment | Amount |
+---------------+--------+
| Offline | 10 |
| Online | 100 |
| Offline | 20 |
| Online | 200 |
| Offline | 30 |
| Online | 300 |
+---------------+--------+
6 rows in set (0.00 sec)

ステップ4:ストアドプロシージャの作成

ここからが本題です。以下は、文字列型の引数を1つ受け取り、その支払い方法に一致する金額だけを合計するストアドプロシージャです。

ポイントはsum(if(ModeOfPayment=PaymentMode,Amount,0))の部分です。各行について、ModeOfPaymentが引数で渡されたPaymentModeと一致すればAmountの値を、一致しなければ0を返すようにしています。この結果をSUMすることで、条件に一致する行のみの合計が得られます。

mysql> delimiter //

mysql> create procedure sp_GetSumWithPaymentMode11(PaymentMode varchar(200))
-> begin
-> select PaymentMode,sum(if(ModeOfPayment=PaymentMode,Amount,0)) as TotalAmount from SumWithIfCondition;
-> end //
Query OK, 0 rows affected (0.32 sec)

mysql> delimiter ;

なお、ストアドプロシージャ内でSQL文を記述する際は、事前にdelimiter //でデリミタを変更し、定義完了後にdelimiter ;で元に戻す点にも注意してください。

ステップ5:ストアドプロシージャの呼び出し

作成したストアドプロシージャは、CALLコマンドを使って呼び出せます。ここでは2つのケースを試してみましょう。

ケース1:「Online」を指定した場合

引数に'Online'を渡して実行します。

mysql> call sp_GetSumWithPaymentMode11('Online');

実行結果は以下の通りです。Onlineの金額(100+200+300)の合計である600が正しく返されました。

+-------------+-------------+
| PaymentMode | TotalAmount |
+-------------+-------------+
| Online | 600 |
+-------------+-------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

ケース2:「Offline」を指定した場合

今度は引数に'Offline'を渡して実行します。

mysql> call sp_GetSumWithPaymentMode11('Offline');

Offlineの金額(10+20+30)の合計である60が返されました。このように、同じストアドプロシージャでも引数を変えるだけで、異なる条件の合計を簡単に取得できます。

+-------------+-------------+
| PaymentMode | TotalAmount |
+-------------+-------------+
| Offline | 60 |
+-------------+-------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.01 sec)

まとめ

MySQLでは、SUM(IF(条件, 値, 0))の形式を使うことで、条件に一致する行だけを合計できます。さらにこれをストアドプロシージャとして定義しておけば、引数を変更しながら何度でも再利用可能です。支払い方法別やカテゴリ別などの集計処理が必要な場面で、ぜひ活用してみてください。

  1. MySQL Workbenchでストアドプロシージャを作成・実行する方法

    MySQL Workbenchでストアドプロシージャを作成する手順 まずは、ストアドプロシージャを作成してみましょう。以下は、MySQL Workbenchを使用してストアドプロシージャを作成するためのクエリ例です。 use business; DELIMITER // DROP PROCEDURE IF EXISTS SP_GETMESSAGE; CREATE PROCEDURE SP_GETMESSAGE() BEGIN DECLARE MESSAGE VARCHAR(100); SET MESSAGE="HELLO"; SELECT CONCAT(MESSAGE, ,

  2. ApacheとMySQLを連携させる方法|ユーザー認証とログ管理の基本

    ApacheとMySQLの連携とは本記事では、Webサーバー「Apache」とデータベース「MySQL」を組み合わせて活用する方法を解説します。Apacheは、Apache Software Foundationによって開発・保守されているWebサーバーソフトウェアです。ユーザーからWebページへのアクセス要求(リクエスト)を受け付け、いくつかのセキュリティチェックを実施したうえで、目的のページへとユーザーを誘導します。MySQLによるユーザー認証MySQLデータベースを使ってユーザー認証を行えるプログラムは数多く存在します。これらのプログラムを利用すれば、アクセスログをMySQLのテーブルに