MySQLで別の列の条件に基づいて列の値を合計する方法
MySQLである列の値を、別の列の条件(例えば入社日の「年」や「月」)が同じレコードごとに合計したい場合は、集計関数SUM()とGROUP BY句を組み合わせることで実現できます。
ここでは、従業員名(EmployeeName)、入社日(JoiningDate)、給与(Salary)を持つテーブルを例に、月ごとの給与合計を求める手順を解説します。
1. サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable -> ( -> EmployeeName varchar(20), -> JoiningDate date, -> Salary int -> ); Query OK, 0 rows affected (0.54 sec)
2. レコードの挿入
続いて、INSERT文を使って複数のレコードを追加します。
mysql> insert into DemoTable values('David','2019-11-02',400);
Query OK, 1 row affected (0.52 sec)
mysql> insert into DemoTable values('Robert','2018-11-25',100);
Query OK, 1 row affected (0.39 sec)
mysql> insert into DemoTable values('Bob','2019-12-14',600);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('Carol','2019-11-03',300);
Query OK, 1 row affected (0.23 sec)
3. テーブルの内容を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable;
実行結果は以下の通りです。
+--------------+-------------+--------+ | EmployeeName | JoiningDate | Salary | +--------------+-------------+--------+ | David | 2019-11-02 | 400 | | Robert | 2018-11-25 | 100 | | Bob | 2019-12-14 | 600 | | Carol | 2019-11-03 | 300 | +--------------+-------------+--------+ 4 rows in set (0.00 sec)
4. 条件ごとにグループ化して合計を求める
以下のクエリでは、入社日の「年」と「月」をYEAR()関数とMONTH()関数で抽出してグループ化し、各グループ内の給与合計をSUM()で算出しています。さらにGROUP_CONCAT()を併用することで、そのグループにどの従業員が含まれているかも確認できます。
mysql> select year(JoiningDate) as JoiningYear, -> month(JoiningDate) as JoiningMonth, -> sum(Salary) as Total, -> group_concat(EmployeeName) as Name -> from DemoTable -> group by JoiningYear,JoiningMonth;
実行結果は以下の通りです。
+-------------+--------------+-------+-------------+ | JoiningYear | JoiningMonth | Total | Name | +-------------+--------------+-------+-------------+ | 2018 | 11 | 100 | Robert | | 2019 | 11 | 700 | David,Carol | | 2019 | 12 | 600 | Bob | +-------------+--------------+-------+-------------+ 3 rows in set (0.04 sec)
まとめ
このように、YEAR()やMONTH()などの関数で抽出した値をGROUP BY句に指定することで、「同じ年月」など特定の条件を満たすレコード同士をひとつのグループにまとめ、SUM()でその列の合計値を簡単に算出できます。
なお、2019年11月のように同じ月に入社したDavidとCarolのレコードは自動的にまとめられ、合計700として表示されます。応用としてWHERE句を組み合わせれば、特定の期間や特定の従業員だけを対象にした集計も可能になりますので、さまざまな場面で活用できます。
-
JavaでResultSetから列名を取得する方法!MySQLを使ったgetMetaData()の実装例を解説
ResultSetから列名を取得するには?getMetaData()メソッドの基本JavaでJDBCを使ってデータベース操作を行っていると、「検索結果(ResultSet)に含まれる列名(カラム名)を動的に知りたい」という場面によく出会います。そんなときに活躍するのが、getMetaData()メソッドです。このメソッドを呼び出すと、結果セットの構造情報(列の数や名前、型など)を持つResultSetMetaDataオブジェクトを取得できます。プロトタイプ宣言は以下のとおりです。ResultSetMetaData getMetaData() throws SQLException;サンプル用テ
-
MySQLで特定のカラム名を持つテーブルを検索する方法
MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a