7.8.1 HAVING句の指定形式および規則
先行するGROUP BY句によってグループ化されたグループの選択条件を,HAVING句で指定します。
GROUP BY句の指定がない場合,先行するWHERE句またはFROM句の結果を,1つのグループと見なして処理を行います。
- 〈この項の構成〉
(1) 指定形式
HAVING句::=HAVING 探索条件
(2) 指定形式の説明
- 探索条件:
-
探索条件の詳細については,「7.19 探索条件」を参照してください。
(3) 規則
-
HAVING句の探索条件中に指定する列指定は,次に示すどれかの条件を満たす必要があります。
-
グループ化列名を指定する
(例1)
SELECT COUNT("C2") FROM "T1" GROUP BY "C1" HAVING "C1">100
下線部分には,同じ列名(グループ化列名)を指定します。
(例2)
SELECT "GC1",COUNT(*) FROM "MEMBERS" GROUP BY CASE WHEN "AGE">=90 THEN 90 ELSE TRUNC("AGE",-1) END AS "GC1" HAVING "GC1">=20
下線部分には,同じ列名(グループ化列名)を指定します。
-
グループ化指定に指定した値式(列指定を含む値式)と同じ値式を指定する
(例)
SELECT "C1"+"C2" FROM "T1" GROUP BY "C1"+"C2" HAVING "C1"+"C2" > 100
下線部分に同じ値式(列指定を含む値式)を指定する必要があります。
-
集合関数の引数に指定する
(例)
SELECT COUNT("C2") FROM "T1" HAVING MAX("C1")>100
下線部分が集合関数の引数の指定です。
-
外への参照列を指定する
(例)
SELECT * FROM "T1" WHERE EXISTS(SELECT * FROM "T2" HAVING MAX("C1")<"T1"."C1")
下線部分が外への参照列の指定です。
-
-
探索条件中の副問合せ中に含まれ,かつ先行するFROM句に指定した表参照の列を参照する列指定は,次に示す条件を満たす必要があります。
-
先行するGROUP BY句に指定した単独の列指定を指定する(グループ化指定の「AS 列名」の指定有無は関係ありません)
(例)
SELECT "C1" FROM "T1" GROUP BY "C1" HAVING EXISTS(SELECT * FROM "T2" WHERE "C1"<"T1"."C1")
下線部分には,先行するGROUP BY句のグループ化列に指定した単独の列指定と同じ列指定を指定します。
-
集合関数の引数に指定する
(例)
SELECT COUNT("C1") FROM "T1" HAVING EXISTS(SELECT * FROM "T2" WHERE "C1"<MAX("T1"."C1"))
下線部分が外への参照列を引数に指定した集合関数です。
-
-
GROUP BY句の結果に対して,HAVING句で指定した探索条件が適用されます。表式の結果が導き出される順序については,「7.4.1 表式の指定形式および規則」の「(3) 規則」を参照してください。
(4) 例題
- 例題1
-
販売履歴表(SALESLIST)から,2011/9/3以降の商品コード(PUR-CODE)ごとの販売個数の合計値,平均値を求めます。
その際,販売個数の合計値が20個以下の商品コードのグループだけを検索対象にします。
SELECT "PUR-CODE",SUM("PUR-NUM") AS "SUM",AVG("PUR-NUM") AS "AVG" FROM "SALESLIST" WHERE "PUR-DATE">=DATE'2011-09-03' GROUP BY "PUR-CODE" HAVING SUM("PUR-NUM")<=20
下線部分がHAVING句の指定です。
実行結果の例
- 例題2
-
全社員の平均年齢より,平均年齢が低い部門(SCODE)とその平均年齢を求めます。
SELECT "SCODE",AVG("AGE") AS "AVG" FROM "EMPLIST" GROUP BY "SCODE" HAVING AVG("AGE")<(SELECT AVG("AGE") FROM "EMPLIST")
下線部分がHAVING句の指定です。
実行結果の例