今回は、SQLにおいて、任意のカラムについてグループ化して集計していく際に便利な「GROUP BY」について解説していきます。
GROUP BYは、データベースのテーブル上に、同じグループで括られるようなレコードが存在しており、そのグループに基づいて売上を集計して表示したり、レコードを計算した上で表示したりする時に役立ちます。
GROUP BYとは?
SQLの「GROUP BY」句は、特定のカラムの値に基づいてレコードのグループ化を行うクエリ(命令)です。集計関数と併用して種類ごとに集計するのに用いられることが多いです。
しばしばCOUNT関数と一緒に記述されることがあり、そちらを見ていくことで理解が進みますので、そちらをサンプルと共に見ていきましょう。
ここでは、以下のサンプルテーブル「customer」を用います。まず、あなたがある企業やお店のために、集客目的の広告を運用する担当者になったと想定してください。
あなたは広告ad1,ad2,ad3を出して、集客を図っており、その結果6名の購入につながりました。そのレコードが「customer」テーブルに保存されています。
「customer」テーブル
1 2 3 4 5 6 7 8 9 10 |
+------------+------------+------------------------+------------+ | name | route | saved_date | price | +------------+------------+------------------------+------------+ | 佐藤 | ad1 | 2023-04-01 17:29:31 | 2100 | | 鈴木 | ad2 | 2023-04-05 13:10:45 | 3500 | | 加藤 | ad1 | 2023-04-19 11:37:01 | 1300 | | 山本 | ad3 | 2023-05-03 15:59:58 | 4200 | | 伊藤 | ad1 | 2023-05-13 09:11:47 | 5000 | | 松田 | ad2 | 2023-05-24 19:49:28 | 2500 | +------------+------------+------------------------+------------+ |
このテーブルに対して、各広告の経路ごとに何名の獲得があったか知りたいとします。広告の費用対効果を知るために必要だというようなケースを想定してください。
この際、以下のSQL文を用いて、簡単に集計して結果を表示させることができます。
1 |
SELECT route, COUNT(route) FROM customer GROUP BY route; |
結果は、以下のようになります。
1 2 3 4 5 6 7 |
+------------+---------------+ | route | COUNT(route) | +------------+---------------+ | ad1 | 3 | | ad2 | 2 | | ad3 | 1 | +------------+---------------+ |
このように、テーブル上のレコードを集計する際に、GROUP BYは大変大きな役割を果たします。続けて、文の構造について詳しく説明していきます。
GROUP BYの使い方は?
GROUP BYを使う際の、基本的な形を構造的に示すと、以下の形になります。
1 |
SELECT [抽出するカラム名] FROM [対象のテーブル名] GROUP BY [同一の値をもつレコードをグルーピングしたいカラム名]; |
実際に使用する際には何かしらの関数と一緒に用いることが多いため、上記の形は最小限のシンプルな形です。あくまで基本形として押さえましょう。
SELECTの後のカラム名と、GROUP BYの後のカラム名は同一のものが含まれるため、そこはセットで必要になると覚えておくといいでしょう。
GROUP BYとWHEREの条件指定は併用できる?
GROUP BYでグルーピングする際、WHERE句を用いて条件の指定をしながら実行することも可能です。
先ほどのサンプルの「customer」テーブルを用いて、WHEREを用いる事例を示します。
1 |
SELECT route, COUNT(route) FROM customer WHERE saved_date BETWEEN '2023-04-01 00:00:00' AND '2023-04-30 23:59:59' GROUP BY route; |
この文では、「saved_date」のカラムで設けられたレコードの生成日を4月に限定するという条件を指定するためにWHEREを用いています。
結果は、以下のようになります。
1 2 3 4 5 6 |
+------------+---------------+ | route | COUNT(route) | +------------+---------------+ | ad1 | 2 | | ad2 | 1 | +------------+---------------+ |
WHERE句によって指定された条件に従って、4月に生成された3つのデータのみが結果に反映されています。
GROUP BYと集計関数の関係は?
これまで、COUNT関数を用いて例を示してきましたが、GROUP BYと共に用いられる集計関数としては、他にSUM、AVG、MAX、MINがあります。
それぞれの関数を引き続き、サンプルテーブル「customer」を用いて示していきます。
GROUP BYをSUM関数と一緒に用いるには?
GROUP BYはSUM関数と同時に用いることができます。SUM関数を用いることで、グループごとに指定したカラムの値の合計値を表示することができます。その使い方を、以下に例で示します。
1 |
SELECT route, SUM(price) FROM customer GROUP BY route; |
結果は、以下のようになります。
1 2 3 4 5 6 7 |
+------------+---------------+ | route | SUM(price) | +------------+---------------+ | ad1 | 8400 | | ad2 | 6000 | | ad3 | 4200 | +------------+---------------+ |
広告のグループ(ad1,ad2,ad3)ごとに購入金額の合計が表示されるといったイメージになります。
GROUP BYをAVG関数と一緒に用いるには?
AVG関数もGROUP BYと同時に用いることができます。AVG関数を用いることで、グループごとに指定したカラムの値の平均値を表示することができます。その使い方を、以下に例で示します。
1 |
SELECT route, AVG(price) FROM customer GROUP BY route; |
結果は、以下のようになります。
1 2 3 4 5 6 7 |
+------------+---------------+ | route | AVG(price) | +------------+---------------+ | ad1 | 2800 | | ad2 | 3000 | | ad3 | 4200 | +------------+---------------+ |
広告のグループ(ad1,ad2,ad3)ごとに購入金額の平均が表示される形になります。
GROUP BYをMAX関数と一緒に用いるには?
MAX関数もGROUP BYと同時に用いることができます。MAX関数は文字通り、最大値を表示します。以下に例文を示します。
1 |
SELECT route, MAX(price) FROM customer GROUP BY route; |
結果は、以下のようになります。
1 2 3 4 5 6 7 |
+------------+---------------+ | route | MAX(price) | +------------+---------------+ | ad1 | 5000 | | ad2 | 3500 | | ad3 | 4200 | +------------+---------------+ |
広告のグループ(ad1,ad2,ad3)ごとに購入金額の最大値が表示されます。
GROUP BYをMIN関数と一緒に用いるには?
MIN関数もGROUP BYと同時に用いることができます。MIN関数はMAX関数と反対に、最小値を表示します。以下に例文を示します。
1 |
SELECT route, MIN(price) FROM customer GROUP BY route; |
結果は、以下のようになります。
1 2 3 4 5 6 7 |
+------------+---------------+ | route | MIN(price) | +------------+---------------+ | ad1 | 1300 | | ad2 | 2500 | | ad3 | 4200 | +------------+---------------+ |
広告のグループ(ad1,ad2,ad3)ごとに購入金額の最小値が表示されます。
まとめ
今回紹介した、GROUP BYはSQLでデータを処理しながら見やすい形で表示するのに必須の句となってきます。
必要な形に、間違うことなくスムーズに処理できるように基本の形をしっかりと押さえておきましょう。
その他、SQLについて例を交えて説明している記事がありますので、参考にしてみてください。
SQLの勉強方法は?
SQLには、今回紹介したGROUP BY以外にも多くの構文があり、完全に習得し、自在にデータを扱えるようになるには多くの学習時間と実践の時間が必要になります。
特に、実践の時間については独学ではなかなか設けることができないものです。実践を交えてSQLを身につけたいと考えるのであれば、総合的な実践まで経験できるプログラミングスクールがおすすめです。
当サイトTECH MANIAでは、最短3か月で基礎から実践力・応用力まで身につけることのできるプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
独学でつまずいた方、一流のITエンジニアとしてスキルを高めていきたい方は必見です。
お問い合わせは以下のリンクからお進みください。