group-by-clause

GROUP BY 節は、前の節の結果である中間結果表の行をグループ化することで構成される結果表を指定します。

グループ化句の構文

構文図を読むビジュアルシンタックスダイアグラムをスキップするGROUP BY ,grouping-expressiongrouping-setssuper-groups

グループ化句の説明

最も単純な形式では、GROUP BY 文節には grouping-expression (グループ化式) が含まれます。

グループ化式
grouping-expression は、 R のグループ化を定義する式です。 grouping-expression には、以下の制約事項が適用されます。
  • grouping-expression が単一の列である場合、列名は R の列を明確に示している必要があります。
  • grouping-expression の結果は、LOB データ・タイプ (または LOB に基づく特殊タイプ) または XML データ・タイプであってはなりません。
  • grouping-expression には、次の項目を含めることはできません。
    • 相関列
    • ホスト変数
    • 集約関数
    • 非 deterministic 関数または式、あるいは外部アクションを行うように定義されている関数または式
    • スカラー全選択
    • 比較述部、全選択を使用する IN 述部、または EXISTS 述部を含む searched-when-clause がある CASE 式

複雑な形式の GROUP BY 節には、 grouping-sets (グループ化集合) および super-groups (スーパー・グループ) が組み入れられます。

GROUP BY の結果は、いくつかの行グループの集まりです。 複数の行からなる各グループ内では、それぞれの grouping-expression の値すべてが等しく、grouping-expression の同じ値の集合をもつ行すべてが同じグループ内にあります。 グループ化を行う場合、grouping-expression の NULL 値はすべて等しいものと見なされます。

grouping-expression に DECFLOAT 値が含まれている場合、同じ値を持った DECFLOAT 値は同じグループになります。 ただし、それぞれのグループに対して戻される数値の個数は予測不能です。

グループの各行には grouping-expression の同じ値が含まれているため、HAVING 文節の検索条件、SELECT 文節の式、または ORDER BY 文節の sort-key-expression で、grouping-expression を使用できます。 いずれの場合も、その参照は各グループの 1 つの値だけを指定します。 例えば、grouping-expression が col1+col2 ならば、col1+col2+3 は選択リストの中で使用できる式です。 式の結合規則により、これと類似した式 3+col1+col2 は使用できませんが、括弧を使用して、対応する式が同じ順序で評価されるようにした場合は別です。 このため、3+(col1+col2) も選択リストの中で使用できます。 連結演算子を使用する場合、grouping-expression は選択リストの中で指定された式と厳密に一致させて使用する必要があります。

grouping-expression に末尾ブランクを含む可変長ストリング が含まれる場合、グループ内の値は、末尾ブランクの数が異なる 場合があり、すべてが同じ長さを持つとは限りません。 この場合でも、grouping-expression の参照が指定する値はグループごとにただ 1 つですが、グループの値は使用できる値のセットから任意に選択されます。 したがって、結果値の実際の長さは予測できません。

行アクセス制御は GROUP BY 文節の操作に影響しません。

grouping-sets

構文図を読むビジュアルシンタックスダイアグラムをスキップするGROUPING SETS( ,grouping-expressionsuper-groups(,grouping-expressionsuper-groups) )

grouping-sets 指定を使用すると、単一のステートメントで複数のグループ化節を指定できます。 これは、行の複数のグループを単一の結果セットにまとめたものと見なすことができます。 これは、1 つのグループ化セットに対応する各副選択で GROUP BY 節を使用して複数の副選択を合併したものと論理的に等しくなります。 グループ化セットは、単一のエレメントになる場合もありますし、括弧によって区切られる複数のエレメントのリストになる場合もあります。 この場合、エレメントは grouping-expression または super-group のいずれかです。 グループは、grouping-sets を使用した基本表の単一パスによって計算できます。

グループ化セットは、GROUP BY 演算の基礎的なビルディング・ブロックです。 単一の列を使用する単純な GROUP BY は、 1 つのエレメントを持つグループ化集合と見なすことができます。 例えば、次の節は等価です。

単純な GROUP BY 節 同等の GROUPING SETS 節
   GROUP BY a
   GROUP BY GROUPING SETS((a))
   GROUP BY a,b,c
   GROUP BY GROUPING SETS((a,b,c))

グループ化セットから除外される副選択の選択リストの非集約の列は、そのグループ化セット用に生成される各行の列に NULL を返します。 これは、集約が列の値を考慮せずに行われたことを表しています。

変更の開始GROUPING SETS が指定されている場合、関連する FROM 節のテーブル参照には、フィールドプロシージャで定義された列を含めてはなりません。 変更の終わり

super-groups

構文図を読むビジュアルシンタックスダイアグラムをスキップするROLLUP(grouping-expression-list)1CUBE(grouping-expression-list)2grand-total
grouping-expression-list
構文図を読むビジュアルシンタックスダイアグラムをスキップする,grouping-expression(,grouping-expression)
grand-total
構文図を読むビジュアルシンタックスダイアグラムをスキップする()
注:
  • 1 グループ化句で単独で使用される場合の代替仕様は、グループ化式リストWITH ROLLUPです。
  • 2 グループ化節で単独で使用する場合の代替仕様は、グループ化式リストWITH CUBEです。
ROLLUP (グループ化式リスト )
ROLLUP グループ化 は、regular グループ化行に加えて、sub-total 行を含む結果セットを生成します。 小計 行とは、グループ化行を入手するのに使用されたのと同じ集約関数を適用して値が得られる集合体が入っているsuper-aggregate「スーパー集約」行です。 これらの行は小計行と呼ばれます。これが最も一般的な用途であるからです。 ただし、集約には任意の集約関数を使用することができます。

ROLLUP グループ化は、一連のグループ化集合 です。 ROLLUP のエレメントが n 個ある場合、n+1 個のグループ化セットに変換されます。

以下の表の最初の列に示す n 個のエレメントを持つ ROLLUP の一般的な仕様は、表の 2 番目の列に示すように、n+1 個のグループ化セットと同等です。
n 個のエレメントを持つ ROLLUP 節 同等の GROUPING SETS 節
GROUP BY ROLLUP(C1,C2,...,Cn-1,Cn)
GROUP BY GROUPING SETS((C1,C2,...,Cn-1,Cn)
                         (C1,C2,...,Cn-1)
                         ...
                         (C1,C2)
                         (C1)
                         () )
注意 : ROLLUPでは、 グループ化式リストの要素の指定順序が重要です。 以下の表に示すように、ROLLUP の grouping-expression-list の初期エレメントは、GROUPING SET 内の最終エレメントです。
ROLLUP 節 同等の GROUPING SETS 節
  GROUP BY ROLLUP(a,b)
  GROUP BY GROUPING SETS((a,b)
                         (a)
                         () )
  GROUP BY ROLLUP(b,a)
  GROUP BY GROUPING SETS((b,a)
                         (b)
                         () )

ORDER BY 節は、結果セットの行の順序を確定する唯一の方法です。

CUBE (グループ化式リスト )
CUBE グループ化 は、ROLLUP 集約のすべての行を含み、さらに cross-tabulation 行を含む結果セットを生成します。 クロス集計 (Cross-tabulation) 行は、小計を持つ集約の一部ではない追加の super-aggregate 行です。

ROLLUP と同じように、CUBE グループ化も、 一連の grouping-sets と見なすことができます。 CUBE の場合、3 乗される grouping-expression-list のすべての順列が総計とともに計算されます。 このため、CUBE の n 個の要素は、2n 個の grouping-sets に変換されます。

例えば、次の節は等価です。

CUBE 節 同等の GROUPING SETS 節
   GROUP BY CUBE(a,b,c)
   GROUP BY GROUPING SETS((a,b,c)
                          (a,b)
                          (a,c)
                          (b,c)
                          (a)
                          (b)
                          (c)
                          ())
注: CUBEの3つの要素は、8つのグループセットに変換されます。

CUBE では、エレメントに指定されている順序は重要ではありません。 CUBE (DayOfYear, Sales_Person)CUBE (Sales_Person, DayOfYear)は、同じ結果セットを生成します (結果セットの順序が異なる場合があります)。

ORDER BY 節は、結果セットの行の順序を確定する唯一の方法です。

グループ化式のリスト
grouping-expression-list は、ROLLUP 節または CUBE 節内で使用して、ROLLUP 操作または CUBE 操作のエレメントの数を定義します。 複数の grouping-expression エレメントを持つエレメントを区切るために括弧を使用することで、エレメントの数が制御されます。

例えば、照会が、County 内ではなく Province 内の City の ROLLUP について合計費用を返すものと想定します。 grouping-expression-list がないと、次の節では County について不要な小計行が表示されます。

   GROUP BY ROLLUP(Province, County, City)

同等の GROUPING SETS 節を比較します。

   GROUP BY GROUPING SETS((Province, County, City)
                          (Province, County)
                          (Province)
                          () )

次の節では、複合体 (County, City) が ROLLUP 節の 1 つのエレメントを形成するので、次の節を使用する照会は、必要としている結果を生成します。

   GROUP BY ROLLUP(Province, (County, City))

つまり、これは 2 つのエレメントの ROLLUP で、次の GROUPING SETS 節と同等です。

   GROUP BY GROUPING SETS((Province, County, City)
                          (Province)
                          () )
合計
ROLLUP と CUBE の両方が全体の集約 (総計) である行を返します。 これは、GROUPING SETS 節内で空の括弧を使用して別々に指定することができます。 また、GROUP BY 節に直接指定することもできます。 これは照会の結果には影響しません。

結合グループ

GROUP BY 節のさまざまなタイプを結合できます。 単純な grouping-expression 式を他のグループと結合する場合、それらの式は、結果の grouping sets の前に付加されます。 ROLLUP 式または CUBE 式が結合される場合、それらの式は、ROLLUP 式または CUBE 式の定義に従って、残りの式で追加のグループ化セットの項目を形成します。

表 1. 結合された grouping-expression と、それと同等の GROUPING SETS 節
結合された grouping-expression を持つ GROUP BY 節 GROUPING SETS 節を持つ、同等の GROUP BY 節
  GROUP BY a, ROLLUP(b,c)
  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a) )
  GROUP BY a, b, ROLLUP(c,d)
  GROUP BY GROUPING SETS((a,b,c,d)
                         (a,b,c)
                         (a,b) )
  GROUP BY ROLLUP(a), ROLLUP(b,c)
  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a)
                         (b,c)
                         (b)
                         () )
  GROUP BY ROLLUP(a), CUBE(b,c)
  GROUP BY GROUPING SETS((a,b,c)
                         (a,b)
                         (a,c)
                         (a)
                         (b,c)
                         (b)
                         (c)
                         () )
  GROUP BY CUBE(a,b), ROLLUP(c,d)
  GROUP BY GROUPING SETS((a,b,c,d)
                         (a,b,c)
                         (a,b)
                         (a,c,d)
                         (a,c)
                         (a)
                         (b,c,d)
                         (b,c)
                         (b)
                         (c,d)
                         (c)
                         () )
  GROUP BY a, ROLLUP(a,b)
  GROUP BY GROUPING SETS((a,b)
                         (a) )
1
注:
  1. 結合されたグループ化セットは、各グループ化セット内の重複も削除します。

グループ化集合を組み合わせる場合の詳しい例は、 完全な CUBE 集約について戻される特定行を除去する結果セットを構成する場合です。 例えば、以下の GROUP BY 節について考えてみます。

  GROUP BY Region,
        ROLLUP(Sales_Person, WEEK(Sales_Date)),
        CUBE(YEAR(Sales_Date), MONTH (Sales_Date))

GROUP BY のすぐ右側にリストされている列はグループ化され、 ROLLUP の後の括弧内の列がロールアップされ、 CUBE の後の括弧内の列は 3 乗されます。 したがって、GROUP BY 節の結果として、YEAR 内の MONTH のキューブが生成されてから、 REGION 内の Sales_Person 内の WEEK の集約内でロールアップが行われます。 この GROUP BY の結果は、Region、Sales_Person または WEEK(Sales_Date) の総計行にもクロス集計行にもならないため、 生成される行は、以下の節より少なくなります。

  GROUP BY ROLLUP (Region, Sales_Person, WEEK(Sales_Date),
                   YEAR(Sales_Date), MONTH(Sales_Date))