SQLのGROUP BYと言えば、SELECTステートメントとセットで使用することで、指定したカラムの値をもとにグループ化をおこなうことができる命令文でしたね。実はそんなSQLのGROUP BYは、単一のカラムだけではなく複数カラムを集計することができるのです。今回は、SQLのGROUP BYで複数カラムを集計する方法について説明していきます。
SQLのGROUP BYとは?
まずはSQLのGROUP BYについて、その使用方法の確認をしていきましょう。先ほども述べた通り、SQLのGROUP BYとは、SELECTステートメントとセットで使用することによって指定したカラムの集計をすることができるものです。以下に使用例を記載するため、参考にしてください。
前提として、以下のようなテーブルがあるとしましょう。
mysql> SELECT * FROM foods; +---------+------+ | food | type | +---------+------+ | Banana | 1 | | Apple | 1 | | Bread | 3 | | Cookie | 3 | | Beef | 2 | | Chicken | 2 | +---------+------+ 6 rows in set (0.00 sec)
上記の「foods」テーブルは、foodカラムに食べ物の名前が書かれており、typeカラムには食べ物のタイプが書かれています。一覧した際にタイプごとにいくつの食べ物があるのかを調べる際、SQLのGROUP BYが便利です。
以下のようなステートメントを入力しましょう。
mysql> SELECT type, COUNT(type) FROM foods GROUP BY type;
以下は、上記ステートメントの出力結果です。
+------+-------------+ | type | COUNT(type) | +------+-------------+ | 1 | 2 | | 3 | 2 | | 2 | 2 | +------+-------------+ 3 rows in set (0.00 sec)
上記のGROUP BYを含んだSELECTステートメントを入力することによって、typeの種類別に個数がカウントされました。GROUP BYを使うことによって、簡単にテーブルごとに指定した値で集計が可能となるのです。
SQLのGROUP BYで複数のカラムを集計!
上記の例では、GROUP BYを使って単一のカラムを集計しました。しかし、GROUP BYの使い道は単一カラムにとどまらず、複数のカラムを集計することもできるのです。こちらでは実際の手順を丁寧に解説していきますので、ぜひ手を動かして、GROUP BYの使い方に慣れていきましょう。
ちなみに今回はMySQLを使用していきます。MySQLはバージョンによって動作が異なるケースもありますので、以下に今回使用したMySQLのバージョンを記しておきます。もし途中でエラーが発生した場合は、こちらも確認してみてください。
$ mysql --version mysql Ver 8.0.18 for osx10.15 on x86_64 (Homebrew)
準備
まずはMySQLを使用するための準備をしていきます。
MySQLのインストール・接続
まだMySQLをインストールしていない場合は、インストールしましょう。
$ brew install mysql
MySQLのインストールが終了したら、接続します。
$ sudo mysql -u root -p
データベースの作成
次にデータベースをMySQL上に作成し、使用するデータベースを指定しましょう。
mysql> CREATE DATABASE potepan; Query OK, 1 row affected (0.00 sec) mysql> USE potepan;
これでMySQLを使用する準備は完了しました。
テーブルの作成
それでは、実際にGROUP BYとCOUNTを組み合わせるハンズオンで使用するテーブルを作成しましょう。
mysql> CREATE TABLE score (name VARCHAR(20), class INT, Japanese INT, English INT, Math INT);Query OK, 0 rows affected (0.02 sec)
上記のSQLステートメントで以下のようなテーブルができました。
mysql> DESC score; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | name | varchar(20) | YES | | NULL | | | class | int(11) | YES | | NULL | | | Japanese | int(11) | YES | | NULL | | | English | int(11) | YES | | NULL | | | Math | int(11) | YES | | NULL | | +----------+-------------+------+-----+---------+-------+ 5 rows in set (0.01 sec)
レコードの挿入
先ほど作成したscoreテーブルにレコードを挿入していきましょう。
mysql> INSERT INTO score VALUES("TARO", 1, 39, 98, 67),("HANAKO", 2, 75, 98, 13),("ICHIRO", 2, 62, 88, 71),("YOSHIKO", 1, 76, 43, 92),("SABURO", 2, 83, 51, 66); Query OK, 5 rows affected (0.00 sec) Records: 5 Duplicates: 0 Warnings: 0
これでテーブルは以下の状態になりました。
mysql> SELECT * FROM score; +---------+-------+----------+---------+------+ | name | class | Japanese | English | Math | +---------+-------+----------+---------+------+ | TARO | 1 | 39 | 98 | 67 | | HANAKO | 2 | 75 | 98 | 13 | | ICHIRO | 2 | 62 | 88 | 71 | | YOSHIKO | 1 | 76 | 43 | 92 | | SABURO | 2 | 83 | 51 | 66 | +---------+-------+----------+---------+------+ 5 rows in set (0.00 sec)
上記の表を見て分かる通り、国語・英語・数学の点数が各生徒ごとに管理され、生徒のクラス番号も分かるテーブルとなります。
SQLのGROUP BYで複数カラムの集計に挑戦
早速、SQLのGROUP BYで複数カラムの集計にトライしてみましょう。ここではクラスごとの点数を3科目ごとに平均化してみます。
以下のステートメントを入力しましょう。
mysql> SELECT class, AVG(Japanese), AVG(English), AVG(Math) FROM score GROUP BY class;
上記のステートメントを入力した結果、以下が出力されました。
+-------+---------------+--------------+-----------+ | class | AVG(Japanese) | AVG(English) | AVG(Math) | +-------+---------------+--------------+-----------+ | 1 | 57.5000 | 70.5000 | 79.5000 | | 2 | 73.3333 | 79.0000 | 50.0000 | +-------+---------------+--------------+-----------+ 2 rows in set (0.00 sec)
上記の通り、複数カラムがGROUP BYによって集計されていることがわかります。このように複数カラムをSELECT文で指定すれば、複数カラムを同時に集計することが可能なのです。
まとめ
今回は、SQLのGROUP BYで複数カラムを集計する方法について説明していきました。単一のカラムだけではなく、複数のカラムをグループ化することができるようになったことで、さらにテーブル内データの集計がしやすくなりましたね。ぜひ、テーブル集計の際には、今回学んだことを活用して、わかりやすくテーブルの整理ができるようになりましょう。