本記事では、GRUOP BYについて解説します。
前回はMAXなどの集計関数について解説しました
今回では、GRUOP BYでのグループ化のやり方についてみていきましょう。
グループ化ができるようになると、グループごとに合計値の取得ができるようになります。
SQLのGROUP BYとは?
GROUP BYとは、SQLにおいてグループ化させるためのもののことです。
GROUP BYを使うことで、グループごとに合計値や平均値の取得ができるようになります。
たとえば、年齢や性別別にテストの平均点を集計することが可能です。
このように、グループごとにデータを集計する際に必要なのが、GROUP BYですね。
SQLのGROUP BYの使い方
GROUP BYの具体的な使い方についてみていきましょう。
次の項目に従って解説していきます。
- グループごとの合計値を取得する
- グループごとの平均値を取得する
- グループごとの合計値を取得後にORDER BYで並び替える
- WHEREで抽出後にグループごとの合計値を取得する
なお、今回は第1回目の記事で作成したテーブルを使って解説します。第1回目の記事で演習用のテーブルを作っていない方は、【SQL入門編1】初心者必見!SQLのクエリの書き方を学ぼうを読んで予め作成してくださいね。
グループごとの合計値を取得する
それではGROUP BYを使ってグループごとの合計値を取得してみましょう。
○コード例
SELECT gender, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY gender;
○実行結果
上記のコードの一番後ろに「GROUP BY gender」と記述されていますね。
GROUP BYは指定したカラム名によってグループ化することが可能です。
genderカラムには「男」と「女」というデータが含まれていますので、2つのグループを作ります。
GROUP BYでグループ分けした後、SUM関数によって、TestScoreをグループごとに合算します。
これがGROUP BYを使う基本的な方法です。
GROUP BYは基本的にSUMやCOUNTなどの集計関数と一緒に使います。
もう一つ例をみておきましょう
○コード例
SELECT age, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY age;
○実行結果
今回はageカラムによってグループ化しています。
各年齢ごとにグループ分けし、SUM関数によって、TestScoreをグループごとに合算します。
グループごとの平均値を取得する
続いて、グループごとの平均値を取得する方法をみていきましょう。
○コード例
SELECT gender, AVG(TestScore) AS 性別別スコア平均 FROM TEST.Student GROUP BY gender;
○実行結果
先程と同じく、GROUP BYでgenderのデータごとにグループ化します。
その後、AVG関数によって、各グループごとにTestScoreの平均値を取得します。
このようにGROUP BYは、AVG関数と組み合わせることも頻出です。
グループごとの合計値を取得後にORDER BYで並び替える
続いて、グループごとの合計値を、ORDER BYで並び替えてみましょう。
GROUP BYとORDER BYを一緒に使うやり方です。
○コード例
SELECT age, AVG(TestScore) AS 年齢別スコア平均 FROM TEST.Student GROUP BY age ORDER BY AVG(TestScore) ASC;
○実行結果
GROUP BYでグループ化した後に、ORDER BYで並び替えを行います。
動作する順番は、GROUP BY⇒ORDER BYという決まりになっているので、注意しましょう。
上記のコードは、GROUP BYによって年齢別にまずグループ化し、AVG関数によってTestScoreの平均値を出しています。
その後、ORDER BYによって、年齢別スコア平均が低い順に並び替えています。
WHEREで抽出後にグループごとの合計値を取得する
最後に、WHEREとGROUP BYの組み合わせ方法をみていきましょう。
○コード例
SELECT gender, SUM(TestScore) AS 10歳以上性別別スコア計 FROM TEST.Student WHERE age>=10 GROUP BY gender;
○実行結果
上記のコードでは、WHEREによってageが10以上の場合のみを抽出しています。
その後、GROUP BYによってgenderごとにグループ化し、SUM関数でTestScoreを合計しています。
WHEREはGROUP BYよりも必ず先に動きます。
そのため、まず特定条件のみをWHEREで抽出し、抽出したデータのみを対象にGROUP BYでグループ化します。
動作する順番としては、
- 1.WHERE
- 2.GROUP BY
- 3.ORDER BY
ということになりますね。
この順番は頭に入れておきましょう。
WITH ROLLUPで全体の合計値も取得する
GROUP BYの後にWITH ROLLUPを使うと、グループ化したそれぞれの数値の合計数を取得できます。
○コード例
SELECT gender, SUM(TestScore) AS 性別別スコア計 FROM TEST.Student GROUP BY gender WITH ROLLUP;
○実行結果
上記のコードでは、GROUP BYとSUM関数によって、「男」のスコア合計と、「女」のスコア合計を算出しています。
その後、WITH ROLLUPによって、【「男」のスコア合計+「女」のスコア合計】、を取得しています。
WITH ROLLUPを使う場合、カラム名が「NULL」になります。
グループ別の合計結果の他に、全体の合計結果も欲しい場合に、WITH ROLLUPは便利です。
まとめ
本記事では、GROUP BYについて解説しました。
GROUP BYでのデータの並び替え方法が、お分かり頂けたかと思います。
GROUP BYを使うことで、各グループごとの合計値や平均値を求めることが可能です。
ORDER BYと名前が似ていてややこしいので、使い方を間違えないようにしましょう。
次回は、GROUP BYとHAVINGを組み合わせて集計する方法を解説していきます。