A common requirement of many applications is to compute subtotals of the grouping attributes from left-to-right, in sequence. This pattern is referred to as a hierarchy because the introduction of additional subtotal calculations produces additional rows with finer granularity of detail. In SQL Anywhere, you can specify a hierarchy of grouping attributes using the ROLLUP keyword to specify a ROLLUP clause.
A query using a ROLLUP clause produces a hierarchical series of grouping sets, as follows. If the ROLLUP clause contains n GROUP BY expressions of the form (X1,X2, ... , Xn) then the ROLLUP clause generates n + 1 grouping sets as:
{(), (X1), (X1,X2), (X1,X2,X3), ... , (X1,X2,X3, ... , Xn)} |
The following query summarizes the sales orders by year and quarter, and returns 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 ROLLUP( Year, Quarter ) ORDER BY Year, Quarter; |
This query returns the following results:
Quarter | Year | Orders | GQ | GY | |
---|---|---|---|---|---|
1 | (NULL) | (NULL) | 648 | 1 | 1 |
2 | (NULL) | 2000 | 380 | 1 | 0 |
3 | 1 | 2000 | 87 | 0 | 0 |
4 | 2 | 2000 | 77 | 0 | 0 |
5 | 3 | 2000 | 91 | 0 | 0 |
6 | 4 | 2000 | 125 | 0 | 0 |
7 | (NULL) | 2001 | 268 | 1 | 0 |
8 | 1 | 2001 | 139 | 0 | 0 |
9 | 2 | 2001 | 119 | 0 | 0 |
10 | 3 | 2001 | 10 | 0 | 0 |
The first row in a result set shows the grand total (648) of all orders, for all quarters, for both years.
Row 2 shows total orders (380) for year 2000, while rows 3-6 show the order subtotals, by quarter, for the same year. Likewise, row 7 shows total Orders (268) for year 2001, while rows 8-10 show the subtotals, by quarter, for the same year.
Note how the values returned by GROUPING function can be used to differentiate subtotal rows from the row that contains the grand total. For rows 2 and 7, 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 (per year).
Likewise, in row 1, the presence of NULL in the Quarter and Year columns, plus the presence of a 1 in the GQ and GY columns, indicate that the row is a totaling of orders for all quarters and for all years.
For more information about the syntax for the ROLLUP clause, see GROUP BY clause.
Alternatively, you can also use the Transact-SQL compatible syntax, WITH ROLLUP, to achieve the same results as GROUP BY ROLLUP. 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 ROLLUP 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 ROLLUP ORDER BY Year, Quarter; |
Send feedback about this page via email or DocCommentXchange | Copyright © 2008, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.0 |