目次へ

5.5. グループ化

SQL におけるグループ化とは、同列内の値の中で、同じ値を持つデータごとに集合化することをいいます。グループ化には GROUP BY 句を用います。また、グループ化された情報に対して条件を設定し、その条件に合致するものだけを抽出することもできます。これには、GROUP BY 句でグループ化する列名を指定した後、HAVING 句を続けて抽出条件を記述します。

5.5.1. GROUP BY 句

GROUP BY 句を用いれば,ある列の値の部分集合を定義して,それに集約関数を適用することができます。この部分集合とは、共通の集約が適用される対象として、ある列に値を持つかのように定義されたグループのことです。例えば、受注表で顧客コードに対する受注個数の最大値を求める場合は次のように書けます。

-- sample.15-1 --
/* グループ化 */

  SELECT 顧客コード , MAX(受注個数) FROM 受注表
         GROUP BY 顧客コード ;

/* 実行結果 */

 顧客コード MAX(受注個数)
 ──────── ──────
 001      30
 002      20
 003      20

GROUP BY 句で顧客コード別に新しいテーブルを一度作成し、それぞれのテーブルの中で受注個数の最大値を集約関数で抽出し、その結果を顧客コード別に表示している、というようなイメージです。

GROUP BY 句は複数の列に使用することもできます。次のサンプルでは、各顧客コードの受注個数の最大値を商品コード別に参照したい場合のものです。

-- sample.15-2 --
/* グループ化 */

  SELECT 顧客コード , 商品コード , MAX(受注個数) FROM 受注表
         GROUP BY 顧客コード , 商品コード ;

/* 実行結果 */

 顧客コード 商品コード MAX(受注個数)
 ──────── ───────── ──────────
 001      0101       15
 001      0102       30
 001      0103       15
 002      0101       20
 002      0102       20
 003      0101       15
 003      0103       20
5.5.2. HAVING 句

sample.15-2 で 20 以上の最大受注個数 (MAX(受注個数)) のみを参照したい場合のように、GROUP BY 句によりグループ化された情報に対して条件を設定する場合は、HAVING 句を用います。実際には次の sample.15-3 のように書きます。

-- sample.15-3 --
/* グループ化 */

  SELECT 顧客コード , 商品コード , MAX(受注個数) FROM 受注表
         GROUP BY 顧客コード , 商品コード
         HAVING MAX(受注個数) >=20;

/* 実行結果 */

 顧客コード 商品コード MAX(受注個数)
 ──────── ───────── ──────────
 001      0102       30
 002      0101       20
 002      0102       20
 003      0103       20

WHERE 句と HAVING 句は条件を設定するという観点からは非常に似たようなもののように見えます。しかし、WHERE 句と HAVING 句とは全く異なるものです。WHERE 句は SELECT 文が行を選ぶときの条件を指定するものですが、HAVING 句は WHERE 句が指定する条件で呼び出された行から、グループを選ぶための条件を与えているのです。ですから行を選ぶ WHERE 句には集約関数を置くことはできませんが、HAVING 句では集約関数を置くことができます。

実習課題1

表に示すテーブル「employee」から、それぞれの事務所の男性の人数を求めるための SQL 文を記述しなさい。表示する列は、「office」及び「男性の人数」である。gender列で、'0' は女性、'1' は男性を表す。

表: employee テーブル
e_num e_name year gender office
101 Ichihara Etsuo 1972 1 20
102 Nishida Toshiko 1978 0 10
103 Nishikino Akiko 1980 0 30
104 Yamaguchi Tomohito 1985 1 10
105 Oda Yuko 1988 0 10
106 Matsushima Nanao 1995 1 20
107 Hirosue Ryotaro 1999 1 30

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ