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.