【SQL超入門講座】06.GROUP BY|グルーピング、グループ化

こんにちは。キノコードです。
このレッスンではSQLのグルーピングについて説明します。
グルーピングといったら少しイメージがつかないかもしれません。
グルーピングとは特定のカラムをもとに集計することができます。
例えば、商品名ごとの合計、平均、最小値、最大値などをすることです。
SQLでのグルーピングは、 GROUP BYを使います。
GROUP BYもORDER BYもWHEREなどと同様に、SELECT文に付けることで、グルーピングすることが可能です。
また、ORDER BYもWHEREと組み合わせて使うこともできます。
PythonのライブラリPandas入門講座をみていただいている方はピンときたかもしれません。
PandasでのグルーピングもGROUP BYメソッドという同じ名前のものを使います。
データ加工が得意のPythonのPandasを学習したことのない方はぜひ、そちらも学んでみてください。

GROUP BYとは

まず最初に、GROUP BYについて説明します。
GROUP BYとは、データをルールにしたがってグルーピングするものです。
SELECTにGROUP BYを付けることで、グルーピングしたいカラムをもとに、集約関数を使って合計や平均、最小値や最大値、カウントなどができるようになります。
具体的に言うと、商品名ごとの売上金額の合計や平均などを計算することができます。
また、GROUP BYは、ORDER BYと組み合わせて、売上金額の合計順に並べたりといったことができます。

GROUP BYの使い方

SELECT グルーピングをするカラム,集計関数
FROM テーブル名 
WHERE 条件式 
GROUP BY グルーピングをするカラム 
ORDER BY ソート条件

GROUP BYの構文はこちらです。
GROUP BYはWHEREとORDER BYの間に書きます。
GROUP BYのところには、グルーピングをしたいカラムを記述します。
SELECTには、グルーピングをしたいカラム,集計関数を記述します。
集計関数とは、合計やカウント、最大値、最小値などを求めることができる関数です。
集計関数のことは、集約関数といったりもします。
これだけだとわかりにくいので、SQLを書いてみていきましょう。

SELECT 商品分類, sum(売上金額) 
FROM test_table
GROUP BY 商品分類

それでは、GROUP BYを使って商品分類ごとの売上金額の合計を計算してみましょう。
商品分類ごとにグルーピングするので、GROUP BYの後ろの商品分類をかきます。
また、SELECTのあとに商品分類を書きましょう。
次に集計関数をかきます。
ExcelやPythonなどと同じくSQLでも合計は集計関数のSUMで求めることができます。
SUMの丸括弧の中に集計対象である売上金額を記述しましょう。
なのでこのSQLは日本語に直すと「テーブルのtest_tableから商品分類ごとに売上金額を合計したデータを、商品分類と一緒に出力する」という意味になります。
それでは実行します。
取得できました。

SELECT 商品名, sum(売上金額) 
FROM test_table
GROUP BY 商品名

次に、商品名ごとの合計をだしてみましょう。
商品分類だったところを商品名に書き換えればオッケーです。
実行します。
商品名ごとに合計を算出できました。

GROUP BYとORDER BYを併用する

SELECT 商品名, sum(売上金額) 
FROM test_table
GROUP BY 商品名
ORDER BY sum(売上金額) 

先ほどから出力しているデータですが、このままだと売上金額がソートされていないので少々見辛くなってしまっています。
GROUP BYとORDER BYを併用することで、この問題を解決しましょう。
ORDER BYのあとに、集計している記述を書きましょう。
それでは実行します。
売上金額を昇順に並び替えることができました。
このように、GROUP BYとORDER BYを組み合わせて使いたい場合は、集計関数まで含めたカラムをORDER BYに指定しましょう。

sum関数以外の集約関数

SELECT
    商品名
    , avg(売上金額)
    , min(売上金額)
    , max(売上金額)
FROM test_table
GROUP BY 商品名

次に、sum関数以外の集計関数を使ってみましょう。
ここで紹介するのはavg、max、min、そしてcountです。
avgは平均、maxは最大値、minは最小値を出力します。
countはグルーピングした対象のデータ数を出力します。
まずはcount以外の集計関数を見ていきましょう。
SQLが長くなってきたので改行を挟んでいます。
このSQLの様に、集約関数は1つのSQL内にいくつあっても構いません。
商品名のカラムをもとに売上金額の平均、最大、最小をそれぞれ出力しています。
実行します。
平均、最小値、最大値が算出されました。

SELECT 
    商品名
    , count(売上金額) 
FROM test_table
GROUP BY 商品名

次にcount関数の使い方を見ていきましょう。
count関数はグルーピングされたレコードの行数を取得する集約関数です。
このSQLを実行すると、商品名の同じレコードがいくつあるのかを出力してくれます。
このcount関数はテーブル内にいくつのレコードがあるのかを出力する場合もよく使用されます。
次のSQLを実行します。

SELECT count(*) 
FROM test_table

またカラムをしていせずに、count丸括弧、アスタリスクと記述すると、テーブルの全件データ数を取得できます。
実行します。
テーブルの全件数を知りたい場合に頻繁に使うSQLの形なので、覚えておきましょう。
以上が、基本的なGROUP BYの使い方です。