【SQL】GROUP BYの使い方は?集計関数やデータをまとめる方法も

【SQL】GROUP BYの使い方は?集計関数やデータをまとめる方法も

当サイトは、海外在住者に向けて情報を発信しています。

SQLはデータベースを管理する上で必要なプログラム言語ですが、文法をしっかりと理解しないと動作しない上に、誤作動するとWEBサイトが動かなくなる可能性もあります。そこでこの記事ではSQLで集計するときに便利なGROUPBYについて解説しています。GROUPBY以外の集計関数の解説もしているので、データのまとめ方が分からない人はぜひこの記事をご覧になってください。

目次

GROUPBYはどういう使い方ができるの?

GROUPBYはプログラムで影響を及ぼす範囲をまとめることができる命令文です。例えば以下のような表が存在するとします。しかし、このままだとどの項目や数値にプログラムの実行結果を反映させるのかコンピューターは判断できません。そこでGROUPBYを使って表の項目をまとめてしまいます。そしてまとめたものの中からどの項目に対してどのような処理を行うのかを命令することになります。

例えば数を計算させたい場合は、数のカラムをまとめる必要があるので、該当のカラムを選択した上でGROUPBYでまとめます。その場合は「SELECT 数 FROM sample GROUP BY 数;」という形になります。

日本語に翻訳すると、「SELECT 数」の部分で数のカラムを選択し、「FROM sample」はどの表から選ぶのかを決めます。そして「GROUP BY 数;」でsampleにある数というカラムを選択し、数のカラムをまとめなさいというプログラム言語になります。

sample
名前
A1
B2
C3

カラム内の数を数えたい場合は

カラム内のデータの数をまとめたいときは、SQLのGROUP BYとCOUNT関数を合わせるという使い方をします。例えば以下のsampleAが存在するとしたら、売っている場所も商品名もバラバラで分かりにくいと思います。そこで仮に販売店でいくつの商品が売られているのかを把握したい場合は、「SELECT 販売店 AS ‘お店’, COUNT(商品名) AS ‘商品数’ FROM sampleA GROUP BY 販売店;」というプログラム言語になります。これは「SELECT 販売店 AS ‘お店’」で販売店のデータをお店として出力するという命令になり、「COUNT(商品名) AS ‘商品数’」で元の表の商品名の数をカウントし、商品数として出力するという命令になります。そして最後の「FROM sampleA GROUP BY 販売店;」は、sampleの表の販売店をグループ化するという命令なので、実行結果はsampleBのようになります。

sampleA
販売店商品名
八百屋りんご
スーパーみかん
八百屋ぶどう
八百屋りんご
スーパーすいか
ディスカウントショップみかん
sampleB
八百屋3
スーパー2
ディスカウントショップ1

表内の合計を数えたいときの集計関数

以下のsampleAのような表が存在し、それぞれの商品の合計金額がいくらなのかを知りたい場合は、集計関数のSUMとSQLのGROUP BYを合わせるという使い方をします。例えばsampleAでは、「SELECT 商品名 AS ‘商品名’, SUM(値段) FROM sampleA GROUP BY 商品名;」と実行するとsampleBのような結果が得られます。詳しく解説すると、「SELECT 商品名 AS ‘商品’」で商品名を商品として出力し、「SUM(値段)」で値段の合計値を計算させます。そして「FROM sampleA GROUP BY 商品名;」でsampleAの商品名をグループ化させる命令を出しているので、出力結果はsampleBのように各商品名の値段の合計値を出力します。

sampleA
商品名値段
りんご700
みかん500
ぶどう900
りんご400
すいか2000
みかん600
sampleB
りんご1100
みかん1100
ぶどう900
すいか2000

平均値を求める集計関数について

表に書かれたデータから平均値を求めたい場合は、SQLの「GROUPBY」と「AVG」を併用するという使い方をします。AVGの書式はAVG(求めたい平均値)となるので、商品名側の項目をGROUPBYでグループ化します。すると、商品名の同じ項目がsampleBのように統一されます。つまり、の平均値を求めるプログラムは「select 商品名, avg(値段) from sampleA group by 商品名;」となります。sampleAの商品名は分かりやすくするためりんごのみになっていますが、りんご以外の商品名があればその商品の値段の平均値も求めてくれます。つまりSQLの「GROUPBY」とは、プログラムの影響を及ぼす範囲を決める使い方をするプログラムだと考えてください。

sampleA
商品名値段
りんご100
りんご200
りんご300
りんご400
りんご500
sampleB
りんご300

最大値と最小値を求める集計関数

表にあるデータの中から最大値を求めたい場合は「MAX」を、最小値を求めたい場合は「MIN」を使い、これらと合わせてSQLの「GROUPBY」で求めたい項目をグループ化するという使い方になります。例えば以下の表で最大値を求めたい場合は、「select 商品名, MAX(値段) from sampleA group by 商品名;」になり、リンゴの最大値である500が出力されます。反対に最小値を求めたいときは、「MAX」の部分を「MIN」にすれば最小値である100が出力されます。

sampleA
商品名値段
りんご100
りんご200
りんご300
りんご400
りんご500
sampleB
りんご500

集計関数の効果範囲を限定してまとめる方法

表の中から最大値や最小値、平均値を求めるときに特定の範囲内の計算結果を求めたいことってありませんか?例えば年齢の最大値を求めたいけれど、20代の年齢で最大値はどこなのかなど、範囲を限定したい場合もあると思います。そこで利用されるのが「HAVING」というプログラムです。書式はhaving 条件となり、例えば「having count < 3」と記述した場合は、3件以上のデータがあるものを表示するという意味になります。なお、countの部分は他の集計関数を使うこともでき、「SUM」を使えば指定した合計数の条件を満たすデータのみを抽出することが可能です。例えば「having SUM(値段) > 200」とした場合は、合計値が200以上のデータを抽出できるので、抽出データの中で除外したいものがあるときに使うときに便利です。

まとめ

SQLの「GROUPBY」とは、表にあるデータをまとめるという使い方ができるプログラムです。さらに集計関数を合わせることで表の中にどのようなデータがあるのかを集計可能です。特に特定データの数を求めるCOUNT関数や最大値や最小値を求めるMAX関数やMIN関数は非常に便利で、「HAVING」と合わせることでさらに細かく収集データを限定することも可能です。ぜひこの記事を参考に、データベースのデータ収集を効率化してみてはいかがでしょうか。

はじめまして、ショリダスです。パソコンやITに苦手意識のある方でも「これなら自分にもできそう」と感じられるような情報を発信していきます。
初心者でもわかりやすいようになるべく専門用語も嚙み砕いて書くことを心がけています。
NordVPN
目次