SQL 概説

グループ化

DB2 ユニバーサル・データベースには、 表の中の特定の列に基づいてデータを分析する機能があります。

GROUP BY 文節でグループ化構造を定義すると、 そのグループ化構造にしたがって行を分類できます。 最も単純な形式の場合、 グループ は、 "GROUP BY" 列に同じ値が入っている行の集合です。 SELECT 文節に指定する列名は、 グループ化列か列関数のいずれかでなければなりません。 列関数は、GROUP BY 文節で定義される各グループごとに値を 1 つずつ戻します。 各グループは、 結果セットの 1 つの行によって表されます。 次の例では、 各部署番号ごとの給与の最大値のリストを生成しています。

     SELECT DEPT, MAX(SALARY) AS MAXIMUM
        FROM STAFF
        GROUP BY DEPT

このステートメントの結果は、次のとおりです。

     DEPT   MAXIMUM  
     ------ ---------
         10  22959.20
         15  20659.80
         20  18357.50
         38  18006.00
         42  18352.80
         51  21150.00
         66  21000.00
         84  19818.00

MAX(SALARY) は、会社全体ではなく、 GROUP BY 文節によって定義される各グループ、 つまり各部署ごとに計算されることに注意してください。

WHERE 文節と GROUP BY 文節の併用

グループ化照会には、 グループが作成されて列関数が計算される前に行をふるいにかけるための標準的な WHERE 文節を含めることができます。 WHERE 文節は、GROUP BY 文節より前に 指定する必要があります。 たとえば、

     SELECT WORKDEPT, EDLEVEL, MAX(SALARY) AS MAXIMUM
        FROM EMPLOYEE
        WHERE HIREDATE > '1979-01-01'
        GROUP BY WORKDEPT, EDLEVEL
        ORDER BY WORKDEPT, EDLEVEL

結果は、次のとおりです。

     WORKDEPT EDLEVEL MAXIMUM    
     -------- ------- -----------
     D11           17    18270.00
     D21           15    27380.00
     D21           16    36170.00
     D21           17    28760.00
     E11           12    15340.00
     E21           14    26150.00

SELECT ステートメントに指定する列名はすべて、GROUP BY 文節の中にも登場しています。 列名がどちらか一方だけにしか使われていないなら、 エラーになります。 この GROUP BY 文節は、WORKDEPT と EDLEVEL の固有の各組み合わせごとに 1 つの行を戻します。

GROUP BY 文節の後に HAVING 文節を使う

ある条件を満たすグループについてのみ結果が戻されるようにするため、 グループに対してフィルター条件を適用することができます。 そのためには、 GROUP BY 文節の後に HAVING 文節を指定します。 HAVING 文節には、述部を 1 つ含めたり、 複数の述部を AND や OR で結合したものを含めたりすることができます。 各述部では、グループの 1 つの特性 (AVG(SALARY) など) を、 次のうちのいずれかと比較します。

たとえば、次の照会では、 従業員が 4 人以上いる部署の給与の最大値と最小値を調べています。

     SELECT WORKDEPT, MAX(SALARY) AS MAXIMUM, MIN(SALARY) AS MINIMUM
        FROM EMPLOYEE
        GROUP BY WORKDEPT
        HAVING COUNT(*) > 4
        ORDER BY WORKDEPT

このステートメントの結果は、次のとおりです。

     WORKDEPT MAXIMUM     MINIMUM    
     -------- ----------- -----------
     D11         32250.00    18270.00
     D21         36170.00    17250.00
     E11         29750.00    15340.00

HAVING 文節はあるが GROUP BY 文節のない照会も、 あまり普通ではありませんが、可能な照会です。 その場合、DB2 は表全体を 1 つのグループとして扱います。 表が単一のグループとして扱われるため、結果の行は多くても 1 行です。 その HAVING 条件が表全体として真であるなら、 選択結果が戻されます (結果は列関数だけで構成されるものでなければなりません)。 そうでないなら、行は戻されません。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]