この章のコードはSample_SQL9.txtを使用します。
集約関数を使用してデータを集約する場合、「職種IDごと」や「商品分類ごと」などのように特定の列をグループ化して集約することができます。グループ化するときに指定する列を「グループ化列」といいます。
1列によるグループ化
GROUP BY句を記述する場合、記述位置に厳密なルールがあります。必ずFROM句の後ろ、WHERE句を記述した場合は、さらにその後ろに記述しなければいけません。この順序を守らないと文法エラーとなります。
書式は下記のとおりです。
<書式9.1>
SELECT <列名1>,<列名2>,…
FROM <テーブル名>
[ WHERE <条件式> ]
GROUP BY <グループ化列名1>,<グループ化列名2>,…;
<SQL例9.1>
SELECT
”Position_ID“,
COUNT(*) AS ”人数“,
SUM(”Salary“) AS ”基本給合計“,
AVG(”Salary“) AS ”基本給平均“,
FROM “Employee”
GROUP BY “Position_ID“;
【<SQL例9.1>の実行結果】
基本給が列「Position_ID」(役職ID)毎に集約されていることが確認されます。
2列によるグループ化
こんどはテーブル「Employee」に「Staff」を結合して、基本給を役職IDと性別毎に集約してみましょう。
<SQL例9.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“;
【<SQL例9.2>の実行結果】
2列によるグループ化(ソート付き)
<SQL例9.2>では列「Gender」が優先して自動ソートされています。これを役職ID、性別順にソートされるよう、ORDER BY句を追加します。
<SQL例9.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“;
【<SQL例9.3>の実行結果】
HAVING句による絞り込み
集約結果をHAVING句を使用して絞り込むことが可能です。WHERE句との違いは、WHERE句はテーブルを検索する際の条件式を指定するのに対し、HAVING句は検索後のデータに対する条件式を指定します。また、HAVING句の条件式には集約した列が主に指定されます。なお、SELECT句で指定した別名(エイリアス)は使用できません。
書式は下記のとおりになります。
<書式9.2>
SELECT <列名1>,<列名2>,…
FROM <テーブル名>
[ WHERE <条件式> ]
GROUP BY <グループ化列名1>,<グループ化列名2>,…
HAVING <条件式>;
<SQL例9.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“;
【<SQL例9.4>の実行結果】
これで基本給平均額が40万円以上のデータに絞り込むことができました。