集約時のグループ化

この章のコードはSample_SQL9.txtを使用します。

集約関数を使用してデータを集約する場合、「職種IDごと」や「商品分類ごと」などのように特定の列をグループ化して集約することができます。グループ化するときに指定する列を「グループ化列」といいます。

1列によるグループ化

GROUP BY句を記述する場合、記述位置に厳密なルールがあります。必ずFROM句の後ろ、WHERE句を記述した場合は、さらにその後ろに記述しなければいけません。この順序を守らないと文法エラーとなります。

書式は下記のとおりです。
<
書式9.1>
SELECT <
列名1>,<列名2>,…
     FROM <
テーブル名>
   [ WHERE <
条件式> ]
     GROUP BY <
グループ化列名1>,<グループ化列名2>,…;

<SQL9.1>
SELECT
     Position_ID,
     COUNT(*) AS
人数,
     SUM(”Salary) AS
基本給合計,
     AVG(”Salary) AS
基本給平均,
     FROM “Employee”
     GROUP BY Position_ID;

<SQL9.1>の実行結果】

基本給が列「Position_ID」(役職ID)毎に集約されていることが確認されます。

2列によるグループ化

こんどはテーブル「Employee」に「Staff」を結合して、基本給を役職IDと性別毎に集約してみましょう。

<SQL9.2>
SELECT
     Position_ID,
     Gender,
     COUNT(*) AS
人数,
     SUM(”Salary) AS
基本給合計,
     AVG(”Salary) AS
基本給平均,
     FROM “Employee”,Staff
     WHERE “Employee”.ID = Staff.ID
     GROUP BY Position_ID,Gender;

<SQL9.2>の実行結果】

2列によるグループ化(ソート付き)

<SQL9.2>では列「Gender」が優先して自動ソートされています。これを役職ID、性別順にソートされるよう、ORDER BY句を追加します。

<SQL9.3>
SELECT
     Position_ID,
     Gender,
     COUNT(*) AS
人数,
     SUM(”Salary) AS
基本給合計,
     AVG(”Salary) AS
基本給平均,
     FROM “Employee”,Staff
     WHERE “Employee”.ID = Staff.ID
     GROUP BY Position_ID,Gender
     ORDER BY Position_ID,Gender;

<SQL9.3>の実行結果】

HAVING句による絞り込み

集約結果をHAVING句を使用して絞り込むことが可能です。WHERE句との違いは、WHERE句はテーブルを検索する際の条件式を指定するのに対し、HAVING句は検索後のデータに対する条件式を指定します。また、HAVING句の条件式には集約した列が主に指定されます。なお、SELECT句で指定した別名(エイリアス)は使用できません。

書式は下記のとおりになります。
<
書式9.2>
SELECT <
列名1>,<列名2>,…
     FROM <
テーブル名>
   [ WHERE <
条件式> ]
     GROUP BY <
グループ化列名1>,<グループ化列名2>,…
     HAVING <
条件式>;

<SQL9.4>
SELECT
     Position_ID,
     Gender,
     COUNT(*) AS
人数,
     SUM(”Salary) AS
基本給合計,
     AVG(”Salary) AS
基本給平均,
     FROM “Employee”,Staff
     WHERE “Employee”.ID = Staff.ID
     GROUP BY Position_ID,Gender
     HAVING AVG(”Salary) >= 400000
     ORDER BY Position_ID,Gender;

<SQL9.4>の実行結果】

これで基本給平均額が40万円以上のデータに絞り込むことができました。

Back> 8.複数テーブルの検索
Next> 10.テーブルの作成とデータの登録

タイトルとURLをコピーしました