GROUP
およびGROUP BY
句は、文の出力をグループ化するためにソース・レコードを結果レコードにマップする方法を指定します。
GROUP
句を省略すると、各ソース・レコードが独自の結果レコードにマップされます。
GROUP
では、すべてのソース・レコードが1つの結果レコードにマップされます。
GROUP BY <attributeList>
では、リストされた属性の値の組合せによって、ソース・レコードが結果レコードにマップされます。
GROUP
句およびGROUP BY
句を含む他のグループ機能(MEMBERS
、CUBE
、GROUPING SETS
など)も使用できます。 これらの関数の詳細は、この項の後半で説明します。
グループ化用BNF文法
GROUP
用のBNF文法表現とグループ関数のファミリは、次のとおりです:
GroupClause ::= GROUP | GROUP BY GroupByList | GROUP BY GroupAll GroupByList ::= GroupByElement | GroupByList , GroupByElement GroupByElement ::= GroupBySingle | GroupingSets | CubeRollup GroupingSets ::= GROUPING SETS (GroupingSetList) GroupingSetList ::= GroupingSetElement | GroupingSetList , GroupingSetElement GroupingSetElement ::= GroupBySingle | GroupByComposite | CubeRollup | GroupAll CubeRollup ::= {CUBE | ROLLUP} (CubeRollupList) CubeRollupList ::= CubeRollupElement | CubeRollupList , CubeRollupElement CubeRollupElement ::= GroupBySingle | GroupByComposite GroupBySingle ::= Identifier | GroupByMembers GroupByComposite ::= (GroupByCompositeList) GroupByCompositeList ::= GroupBySingle | GroupByCompositeList, GroupBySingle GroupByMembers ::= MEMBERS (Identifier | Identifier.Identifier) AS Identifier GroupAll ::= ()
GroupAll
を使用すると、次のようにすべて同等になります:
GROUP = GROUP BY() = GROUP BY GROUPING SETS(())
GROUPのみを指定
GROUP
句を使用すると、結果を単一のバケットに集計できます。 BNF文法が示すように、GROUP
句は引数を取りません。
SUM
文を使用して、レコード・セット全体に単一の合計が返されます:
RETURN ReviewCount AS SELECT SUM(NumReviews) AS NumberOfReviews FROM ProductState GROUP
この文は、NumberOfReviewsのレコードを1つ戻します。 値は、NumReviews属性の値の合計です。
GROUP BYの指定
GROUP BY
を使用して、グループ化キーについて共通の値を持つバケットに結果を集計できます。 GROUP BY
構文は、次のとおりです:
GROUP BY attributeList
ここで、attributeListは単一の属性で、複数の属性のカンマ区切りリスト、GROUPING SETS
、CUBE
、ROLLUP
または()を使用して空のグループを指定します。 空のグループは合計を生成します。
ソースおよびローカルに定義された属性でグループ化が許可されます。
注意:
ローカルに定義された属性でグループ化する場合は、その属性は非グループ化属性を参照できず、集計を含めることはできません。 ただし、IN
式およびルックアップ式はこのコンテキストで有効です。
すべてのグループ化属性は結果レコードの一部です。 どのグループ化属性でも、NULL値(単一割当属性の場合)または空のセット(複数割当属性の場合)は他の値と同様に扱われます。つまり、ソース・レコードが結果レコードにマップされます。 EQLでのユーザー定義のNULL値処理の詳細は、COALESCEを参照してください。
{ TransId, ProductType, Amount, Year, Quarter, Region, SalesRep, Customer }
{ TransId = 1, ProductType = "Widget", Amount = 100.00, Year = 2011, Quarter = "11Q1", Region = "East", SalesRep = "J. Smith", Customer = "Customer1" }
GROUP BY
属性としてリージョンと年を使用する場合、文の結果には、有効で空でないリージョンと年の組合せごとの集計レコードが含まれます。 EQLでは、この例は次のように表現されます:
DEFINE RegionsByYear AS GROUP BY Region, Year{ Region, Year }形式の集計結果。次に例を示します:
{ "East", "2010" } { "West", "2011" } { "East", "2011" }
GROUP BY
句では、重複した列を使用できます。 つまり、次の2つの問合せは同等として処理されます:
RETURN Results AS SELECT SUM(PROMO_COST) AS PR_Cost FROM SaleState GROUP BY PROMO_NAME RETURN Results AS SELECT SUM(PROMO_COST) AS PR_Cost FROM SaleState GROUP BY PROMO_NAME, PROMO_NAME
SELECT式の出力であるGROUP BYの使用方法
GROUP BY
キーは、式自体に集計関数が含まれていないかぎり、SELECT
式の出力にすることができます。
GROUP BY
の正しい使用方法です:
SELECT COALESCE(Person, 'Unknown Person') AS Person2, ... GROUP BY Person2
SUM
)が含まれているため、エラーとなります:
SELECT SUM(Sales) AS Sales2, ... GROUP BY Sales2