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 文節を含めることができます。 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 文節を指定します。 HAVING 文節には、述部を 1 つ含めたり、 複数の述部を AND や OR で結合したものを含めたりすることができます。 各述部では、グループの 1 つの特性 (AVG(SALARY) など) を、 次のうちのいずれかと比較します。
たとえば、
HAVING AVG(SALARY) > 2 * MIN(SALARY)
たとえば、
HAVING AVG(SALARY) > 20000
たとえば、次の照会では、 従業員が 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 条件が表全体として真であるなら、 選択結果が戻されます (結果は列関数だけで構成されるものでなければなりません)。 そうでないなら、行は戻されません。