3.2 「GROUP BY」句と集計関数

「GROUP BY」句を単独で使うことは少なく、集計関数と同時に用いられるのが一般的です。ここでは、「GROUP BY」句と集計関数を組み合わせた使い方を解説します。

3.2.1 「GROUP BY」句とAVG関数

AVG関数は前の章で解説したように平均値を取る関数でしたが、「GROUP BY」句と組み合わせると、グループ化キー毎の平均値を出すことができます。書式は下記のようになります。

    SELECT グループ化キー,AVG(列名) FROM テーブル名 GROUP BY グループ化キー;

例えば「orderinfo」で、ユーザー毎の平均注文数を出す場合は下記のようになります。

    SELECT user,AVG(quantity) FROM orderinfo GROUP BY user;

3.2.2 「GROUP BY」句とCOUNT関数

COUNT関数もAVG関数同様、「GROUP BY」句と組み合わせることで、グループ化キーごとの行数を算出することができます。書式は下記のようになります。

    SELECT グループ化キー,COUNT(列名) FROM テーブル名 GROUP BY グループ化キー;

「orderinfo」で、ユーザー毎の行数(この場合は注文回数)を出す場合は下記のようになります。

    SELECT user,COUNT(orderno) FROM orderinfo GROUP BY user;

3.2.3 「GROUP BY」句とSUM関数

次はSUM関数と「GROUP BY」句の組み合わせを見ていきます。書式は下記のようになります。

    SELECT グループ化キー,COUNT(列名) FROM テーブル名 GROUP BY グループ化キー;

今度は「orderinfo」で、ISBN番号ごとの注文数の合計を出して見ましょう。DML文は下記のようになります。

    SELECT isbn,SUM(quantity) FROM orderinfo GROUP BY isbn;

3.2.4 「GROUP BY」句とMAX関数、MIN関数

今回はMAX関数、MIN関数と「GROUP BY」句の組み合わせを同時に解説します。
書式はMAX関数の場合は、

    SELECT グループ化キー,MAX(列名) FROM テーブル名 GROUP BY グループ化キー;

MIN関数の場合は、

    SELECT グループ化キー,MIN(列名) FROM テーブル名 GROUP BY グループ化キー;

のようになりますが、同じグループ化キーで集計する場合、集計関数は複数指定することができます。
例えば「orderinfo」で、ユーザーごとに最初の注文日と最終注文日を調べてみましょう。最初の注文日はdate列の最小値を、最終注文日は同じくdate列の最大値を取得することで算出できます。DML文は下記のようになります。

    SELECT user,MIN(date),MAX(date) FROM orderinfo GROUP BY user;

グループ化キーの複数指定

グループ化キーは複数指定することもできます。下記のようになります。

   SELECT グループ化キー1, グループ化キー2・・・,集計関数(列名) FROM テーブル名
   GROUP BY グループ化キー1, グループ化キー2・・・;

例えば「orderinfo」で、ユーザーごと、ISBN番号ごとの注文数合計をとる場合は、

   SELECT user,isbn,SUM(quantity) FROM orderinfo GROUP BY user,isbn;

となります。

また、グループ化キーは「SELECT」句に必ず含めなければならないわけではありません。例えば下記のように、ユーザーごとの注文数量合計を出す場合に、ユーザー名を出さないように書いても、SQLの構文上はエラーにはなりません。

   SELECT SUM(quantity) FROM orderinfo GROUP BY user;

但し結果を見てもわかるように、どのデータの集計結果かはわからないので、特殊な使用例と言えるでしょう。