The GROUP and GROUP BY clauses specify how to map source records to result records in order to group statement output.
You can also use other grouping functions (such as CUBE or GROUPING SETS) with the GROUP and GROUP BY clauses. Details on these functions are given in later in this chapter.
GroupByList ::= 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 GroupByComposite ::= (GroupByCompositeList) GroupByCompositeList ::= GroupBySingle | GroupByCompositeList, GroupBySingle GroupAll ::= ()
GROUP = GROUP BY() = GROUP BY GROUPING SETS(())
You can use a GROUP clause to aggregate results into a single bucket. As the BNF grammar shows, the GROUP clause does not take an argument.
RETURN ReviewCount AS SELECT SUM(NumReviews) AS NumberOfReviews GROUP
This statement returns one record for NumberOfReviews. The value is the sum of the values for the NumReviews attribute.
GROUP BY(attributeList)where attributeList is a single attribute, a comma-separated list of multiple attributes, GROUPING SETS, CUBE, ROLLUP, or () to specify an empty group. The empty group generates a total.
Grouping is allowed on source and locally-defined attributes.
All grouping attributes are part of the result records. A NULL value in any grouping attribute is treated like any other value, which means the source record is mapped to result records. (However, note that NULL values are ignored if selecting from the corpus.) For information about user-defined NULL-value handling in EQL, see 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" }
DEFINE RegionsByYear AS GROUP BY Region, Yearresulting in the aggregates of the form { Region, Year }, for example:
{ "East", "2010" } { "West", "2011" } { "East", "2011" }
RETURN Results AS SELECT SUM(PROMO_COST) AS PR_Cost GROUP BY PROMO_NAME RETURN Results AS SELECT SUM(PROMO_COST) AS PR_Cost GROUP BY PROMO_NAME, PROMO_NAME
A GROUP BY key can be the output of a SELECT expression, as long as that expression itself does not contain an aggregation function.
SELECT COALESCE(Person, 'Unknown Person') AS Person2, ... GROUP BY Person2
SELECT SUM(Sales) AS Sales2, ... GROUP BY Sales2
You can group by a specified depth of each managed attribute. However, GROUP BY statements cannot use the ANCESTOR function (because you cannot group by an expression in EQL). Therefore, you must first use ANCESTOR with the SELECT statement and then specify the aliased results in the GROUP BY clause.
SELECT ANCESTOR("Region", 1) AS StateInfo ... GROUP BY StateInfo
This can only occur with a corpus source, because result records are always single assign.
RETURN "Example" AS SELECT AVG("Gross") AS "AvgGross", SUM("Gross") AS "TotalGross" GROUP BY UserTag
To define the set of resulting buckets, a statement must specify a set of GROUP BY attributes. The cross product of all values in these grouping attributes defines the set of candidate buckets.
The results are automatically pruned to include only non-empty buckets.
If an attribute reference appears in a statement with a GROUP clause in the definition of an attribute not in the GROUP clause, the attribute will have an implicit ARB aggregate applied.