As an alternative to the hierarchical grouping pattern provided by the ROLLUP clause, you can also create a data cube, that is, an n-dimensional summarization of the input using every possible combination of GROUP BY expressions, using the CUBE clause. The CUBE clause results in a product set of all possible combinations of elements from each set of values. This can be very useful for complex data analysis.
If there are n GROUPING expressions of the form (X1,X2, ...,Xn) in a CUBE clause, then CUBE generates 2n grouping sets as:
{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ...,Xn), (X2), (X2,X3), (X2,X3,X4), ... , (X2,X3,X4, ... , Xn), ... , (Xn)}. |
The following query summarizes sales orders by year, by quarter, and quarter within year, and yields the result set shown in the table below:
SELECT QUARTER( OrderDate ) AS Quarter, YEAR( OrderDate ) AS Year, COUNT( * ) AS Orders, GROUPING( Quarter ) AS GQ, GROUPING( Year ) AS GY FROM SalesOrders GROUP BY CUBE ( Year, Quarter ) ORDER BY Year, Quarter; |
This query returns the following results:
Quarter | Year | Orders | GQ | GY | |
---|---|---|---|---|---|
1 | (NULL) | (NULL) | 648 | 1 | 1 |
2 | 1 | (NULL) | 226 | 0 | 1 |
3 | 2 | (NULL) | 196 | 0 | 1 |
4 | 3 | (NULL) | 101 | 0 | 1 |
5 | 4 | (NULL) | 125 | 0 | 1 |
6 | (NULL) | 2000 | 380 | 1 | 0 |
7 | 1 | 2000 | 87 | 0 | 0 |
8 | 2 | 2000 | 77 | 0 | 0 |
9 | 3 | 2000 | 91 | 0 | 0 |
10 | 4 | 2000 | 125 | 0 | 0 |
11 | (NULL) | 2001 | 268 | 1 | 0 |
12 | 1 | 2001 | 139 | 0 | 0 |
13 | 2 | 2001 | 119 | 0 | 0 |
14 | 3 | 2000 | 10 | 0 | 0 |
The first row in the result set shows the grand total (648) of all orders, for all quarters, for years 2000 and 2001 combined.
Rows 2-5 summarize sales orders by calendar quarter in any year.
Rows 6 and 11 show total Orders for years 2000, and 2001, respectively.
Rows 7-10 and rows 12-14 show the quarterly totals for years 2000, and 2001, respectively.
Note how the values returned by the GROUPING function can be used to differentiate subtotal rows from the row that contains the grand total. For rows 6 and 11, the presence of NULL in the Quarter column, and the value of 1 in the GQ column (Grouping by Quarter), indicate that the row is a totaling of Orders in all quarters for the year.
The result set generated through the use of CUBE can be very large because CUBE generates an exponential number of grouping sets. For this reason, a GROUP BY clause containing more than 64 GROUP BY expressions is not supported. If a statement exceeds this limit, it fails with SQLCODE -944 (SQLSTATE 42WA1).
Alternatively, you can also use the Transact-SQL compatible syntax, WITH CUBE, to achieve the same results as GROUP BY CUBE. However, the syntax is slightly different and you can only supply a simple GROUP BY expression list in the syntax.
The following query produces an identical result to that of the previous GROUP BY CUBE example:
SELECT QUARTER( OrderDate ) AS Quarter, YEAR( OrderDate ) AS Year, COUNT( * ) AS Orders, GROUPING( Quarter ) AS GQ, GROUPING( Year ) AS GY FROM SalesOrders GROUP BY Year, Quarter WITH CUBE ORDER BY Year, Quarter; |
Discuss this page in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |