9.19.6.Grouping Sets
The grouping sets variant of group by allows specifying exactly
which combinations of groupings are needed. CUBE
and ROLLUP
are
shorthands that expand into a grouping sets specification. This is
useful for applications like faceted search where there are
separate group by's on properties of interest.
The grouping function behaves identically to CUBE
and ROLLUP
.
The syntax is:
GROUP BY grouping sets (<grouping set>[,...])
The grouping set is a list of grouping columns in parentheses or
()
to denote an aggregate without
grouping.
For example:
SELECT key_table, key_is_main, COUNT (*) FROM SYS_KEYS GROUP BY grouping sets ((key_table), (key_is_main), ());
This shows for each table the number of indices, then the number
of primary key and non-primary key indices across all tables and
finally the total number of indices in the schema. A CUBE
would produce these same groupings but it would
further add the key_table
, key_is_main
grouping.
As an extension to SQL 99 OLAP extensions, the Virtuoso grouping
sets specification also supports an ORDER
BY
with optional top. In the place of a grouping set one can
write:
ORDER BY [top k] (<column> [,...])
In this way a single query can produce a set of ordered result rows and different grouped aggregates on the columns in the result set.