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

MySQLクエリで複数の合計値を取得し、別々の列として表示する方法

MySQLクエリで複数の合計(SUM)を1回のクエリで取得し、それぞれを独立した列として表示したい場合には、CASE文を活用します。CASE文を使うことで、条件に一致する行だけを集計対象にでき、プレイヤーごとの合計スコアのように、カテゴリ別の合計値を横並びの列として一度に取り出すことが可能です。

基本構文

まずは基本となる構文を見てみましょう。

SELECT
  SUM( CASE WHEN 列名1 = '値1' THEN 列名2 END ) AS 別名1,
  SUM( CASE WHEN 列名1 = '値2' THEN 列名2 END ) AS 別名2,
  SUM( CASE WHEN 列名1 = '値3' THEN 列名2 END ) AS 別名3
FROM テーブル名;

この構文では、CASE WHEN の条件が真となる行の値だけがSUM関数によって合計されます。条件に一致しない行はNULLとなり、SUM関数はNULLを無視するため、各列には目的のグループの合計値だけが表示される仕組みです。

サンプルテーブルの作成

実際の動きを確認するため、プレイヤー名とスコアを格納するテーブルを作成します。

mysql> create table selectMultipleSumDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> PlayerName varchar(20),
    -> PlayerScore int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.58 sec)

テストデータの挿入

続いて、INSERTコマンドでレコードを追加していきます。

mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',89);
Query OK, 1 row affected (0.23 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',98);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',96);
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',78);
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Maxwell',51);
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('Ricky',89);
Query OK, 1 row affected (0.21 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('David',56);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectMultipleSumDemo(PlayerName,PlayerScore) values('David',65);
Query OK, 1 row affected (0.19 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select *from selectMultipleSumDemo;

実行結果は以下の通りです。

+----+------------+-------------+
| Id | PlayerName | PlayerScore |
+----+------------+-------------+
|  1 | Maxwell    |          89 |
|  2 | Ricky      |          98 |
|  3 | Maxwell    |          96 |
|  4 | Ricky      |          78 |
|  5 | Maxwell    |          51 |
|  6 | Ricky      |          89 |
|  7 | David      |          56 |
|  8 | David      |          65 |
+----+------------+-------------+
8 rows in set (0.00 sec)

複数の合計を別々の列として取得するクエリ

それでは、プレイヤーごとの合計スコアを、それぞれ独立した列として取得してみましょう。

mysql> select
    -> SUM(CASE WHEN PlayerName='Maxwell' THEN PlayerScore END) AS 'MAXWELL TOTAL SCORE',
    -> SUM(CASE WHEN PlayerName='Ricky' THEN PlayerScore END) AS 'RICKY TOTAL SCORE',
    -> SUM(CASE WHEN PlayerName='David' THEN PlayerScore END) AS 'DAVID TOTAL SCORE'
    -> from selectMultipleSumDemo;

実行結果は以下の通りです。

+---------------------+-------------------+-------------------+
| MAXWELL TOTAL SCORE | RICKY TOTAL SCORE | DAVID TOTAL SCORE |
+---------------------+-------------------+-------------------+
|                 236 |               265 |               121 |
+---------------------+-------------------+-------------------+
1 row in set (0.00 sec)

Maxwellの合計236点、Rickyの合計265点、Davidの合計121点が、それぞれ別の列として正しく表示されました。

補足:GROUP BYとの違い

同じような結果は GROUP BY PlayerName を使っても得られますが、GROUP BYの場合は各グループが縦方向(行)に並びます。一方、CASE文を使う方法では、複数の合計値を横方向(列)に展開できるのが大きな特徴です。レポートやダッシュボードなど、ピボットテーブルのような形式でデータを表示したい場合に特に有効なテクニックなので、ぜひ覚えておきましょう。

  1. MySQLでSELECTクエリを使用してデータを挿入(INSERT)する方法

    MySQLでは、INSERT文とSELECTクエリを組み合わせることで、テーブルにデータを挿入することができます。通常、SELECTは既存のテーブルからデータを取得するために使われますが、値を直接指定してINSERTを実行する際にも活用できる便利な手法です。基本構文SELECTクエリを使用してINSERTを実行する場合の構文は以下の通りです。insert into yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,...N) select yourValue1,yourValue2,yourValue3,......N;

  2. MySQLでハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法

    ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形