Hitachi

Hitachi Advanced Data Binder SQLリファレンス


7.8.1 HAVING句の指定形式および規則

先行するGROUP BY句によってグループ化されたグループの選択条件を,HAVING句で指定します。

GROUP BY句の指定がない場合,先行するWHERE句またはFROM句の結果を,1つのグループと見なして処理を行います。

〈この項の構成〉

(1) 指定形式

HAVING句::=HAVING 探索条件

(2) 指定形式の説明

探索条件

探索条件の詳細については,「7.19 探索条件」を参照してください。

(3) 規則

  1. 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")

      下線部分が外への参照列の指定です。

  2. 探索条件中の副問合せ中に含まれ,かつ先行する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"))

      下線部分が外への参照列を引数に指定した集合関数です。

  3. 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句の指定です。

実行結果の例

[図データ]