sql グループ化と集計関数

SQL

データアナリストがSQLの集計関数とグループ化を解説!

皆さんこんにちは。合同会社StudioData代表のRyumaと申します。

今回はSQLの集計関数とグループ化について解説していきます。

グループ化とは?

グループ化とはカラムの中身が同じものをまとめたり、値を集計する時などに役に立つSQLの技の一つです。

例として下記のテーブルをstudentsテーブルと命名した上で解説します。

データベース human2

例えばstudentsテーブルのうち男性と女性のスコアの合計点をそれぞれ出すとします。この時にグループ化を行います。

SQLではグループ化をする際、下記のような形で記載します。

GROUP BY
グループ化するカラム名

最終的に以下のような形で結果を出すためにどのようなクエリを書けばいいのかを次の章で解説していきます。

sql sum group by

集計関数とGROUP BYを使おう

GROUP BYと一緒に使うことが多い「集計関数」について解説します。

Excelやスプレッドシートでも見かけることが多い、SUM(),COUNT(),MAX(),MIN(),AVG()などのことです。

複数のデータのうち、合計や数、一番大きい数をまとめた上で取得してくれます。

早速studentsテーブルの例で「男女ごとのScoreの合計」を取得するクエリを書いていきましょう。

SELECT
  Gender,
  SUM(Score) AS SUM
FROM
  students
GROUP BY
  Gender

2行目の「AS SUM」の書き方ですが「AS "〇〇"」で「以下はこれのことを〇〇と呼ぶよ」と宣言することができます。

SELECT句でGenderカラムとScoreカラムの合計値を取得するSUM(Score)を選択しています。

そしてポイントなのが6,7行目で「GROUP BY Gender」としている点です。

これによってGenderごとにまとめられるので男女ごとにScoreの合計値が取得出来ます。

HAVINGとクエリの実行順序

続いてHAVINGについて軽く説明するために下記のテーブルを用意しました。

testsテーブル

testsテーブルと命名したこのテーブルは、誰が何の科目のテストを受け、点数は何点だったのかを情報として持っています。

この時、3科目以上受験した生徒を出力したいときはどうすればいいのでしょうか。下記のようなクエリを書きます。

SELECT
  name,
  COUNT(subject_id) AS subject_count
FROM
  tests
GROUP BY
  name
HAVING
  COUNT(subject_id) >= 3

1~7行目で「nameごとのCOUNT(subject_id)をGROUP BY name」として取得しているので「誰が何科目受験したか」を取得できます。

そして8,9行目で「COUNT(subject_id)をした時にその値が3以上である」という条件を追加しています。

なぜ「〇〇という条件」を指定するWHERE句を使わずHAVINGを使うのかは、クエリを実行する順番が関係しています。

sql 実行順序

こちらの画像の上から順にクエリが実行されると考えてください。そうするとWHEREは「GROUP BY」や「COUNT,SUMなど」よりも先に実行され、HAVINGはそれより後に実行されています。

つまり「COUNT(subject_id)が3以上」という条件は「グループ化」と「関数」の実行後でなければクエリが理解できない条件なのです。

そのために関数を使った条件はWHERE句ではなくHAVING句で指定します。

ORDER BYとGROUP BY

最後に「ORDER BY」について解説します。ここではSELECT句で取得したデータを指定した条件で並べ替えることができます。

SELECT
  name,
  COUNT(subject_id) AS subject_count
FROM
  tests
GROUP BY
  name
HAVING
  COUNT(subject_id) >= 3

先ほどのこちらのクエリを「受験した科目が大きい順」に並べ替えるとします。その場合下記のように「ORDER BY」を追加してあげることで並べ替えが可能です。

SELECT
  name,
  COUNT(subject_id) AS subject_count
FROM
  tests
GROUP BY
  name
HAVING
  COUNT(subject_id) >= 3
ORDER BY
  subject_count DESC

10,11行目の「ORDER BY subject_count DESC」で「subject_countを降順で並べ替え」と命令しています。

降順はDESC、昇順はASC(ASCは省略可能)で指定しましょう。

ORDER BYはSELECT句よりも後に実行されるため「COUNT(subject_id) AS subject_count」と名前をつけたものが使えます。

複雑な関数を使った際などはいちいちそれをORDER BYで書くのは面倒なので名前をつけておくと楽になります!

SQLの集計関数とGROUP BYまとめ

今回はSQLの集計関数とGROUP BYを中心に解説させていただきました。

特にクエリの実行順番を正しく理解することでエラーの原因やどのような記述にすれば良いかなどが分かってきますので、是非ともここはしっかりと理解しておいてください!

最後までご視聴いただきありがとうございました!

-SQL
-, ,

© 2024 今すぐ使えるデータサイエンス Powered by AFFINGER5