【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))の形式を使うことで、条件に一致する行だけを合計できます。さらにこれをストアドプロシージャとして定義しておけば、引数を変更しながら何度でも再利用可能です。支払い方法別やカテゴリ別などの集計処理が必要な場面で、ぜひ活用してみてください。
-
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, ,
-
ApacheとMySQLを連携させる方法|ユーザー認証とログ管理の基本
ApacheとMySQLの連携とは本記事では、Webサーバー「Apache」とデータベース「MySQL」を組み合わせて活用する方法を解説します。Apacheは、Apache Software Foundationによって開発・保守されているWebサーバーソフトウェアです。ユーザーからWebページへのアクセス要求(リクエスト)を受け付け、いくつかのセキュリティチェックを実施したうえで、目的のページへとユーザーを誘導します。MySQLによるユーザー認証MySQLデータベースを使ってユーザー認証を行えるプログラムは数多く存在します。これらのプログラムを利用すれば、アクセスログをMySQLのテーブルに