17
Enhancements to the
GROUP BY Clause
Copyright © Oracle Corporation, 2001. All rights
Objectives
After completing this lesson, you should be able
to do the following:
• Use the ROLLUP operation to produce
subtotal values
• Use the CUBE operation to produce cross-
tabulation values
• Use the GROUPING function to identify the row
values created by ROLLUP or CUBE
• Use GROUPING SETS to produce a single result set
17-2 Copyright © Oracle Corporation, 2001. All rights
Review of Group Functions
Group functions operate on sets of rows to give one
result per group.
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
Example:
Example:
SELECT AVG(salary), STDDEV(salary),
COUNT(commission_pct),MAX(hire_date)
FROM employees
WHERE job_id LIKE 'SA%';
17-3 Copyright © Oracle Corporation, 2001. All rights
Review of the GROUP BY Clause
Syntax:
Syntax:
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
Example:
Example:
SELECT department_id, job_id, SUM(salary),
COUNT(employee_id)
FROM employees
GROUP BY department_id, job_id ;
17-4 Copyright © Oracle Corporation, 2001. All rights
Review of the HAVING Clause
SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING having_expression]
[ORDER BY column];
• Use the HAVING clause to specify which groups
are to be displayed.
• You further restrict the groups on the basis of a
limiting condition.
17-5 Copyright © Oracle Corporation, 2001. All rights
GROUP BY with ROLLUP and
CUBE Operators
• Use ROLLUP or CUBE with GROUP BY to produce
superaggregate rows by cross-referencing
columns.
• ROLLUP grouping produces a results set
containing the regular grouped rows and the
subtotal values.
• CUBE grouping produces a results set containing
the rows from ROLLUP and cross-tabulation rows.
17-6 Copyright © Oracle Corporation, 2001. All rights
ROLLUP Operator
SELECT [column,] group_function(column). . .
FROM table
[WHERE condition]
[GROUP BY [ROLLUP] group_by_expression]
[HAVING having_expression];
[ORDER BY column];
• ROLLUP is an extension to the GROUP BY clause.
• Use the ROLLUP operation to produce cumulative
aggregates, such as subtotals.
17-7 Copyright © Oracle Corporation, 2001. All rights
ROLLUP Operator Example
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY ROLLUP(department_id, job_id);
1
2
17-8 Copyright © Oracle Corporation, 2001. All rights
CUBE Operator
SELECT [column,] group_function(column)...
FROM table
[WHERE condition]
[GROUP BY [CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
• CUBE is an extension to the GROUP BY clause.
• You can use the CUBE operator to produce cross-
tabulation values with a single SELECT statement.
17-9 Copyright © Oracle Corporation, 2001. All rights
CUBE Operator: Example
SELECT department_id, job_id, SUM(salary)
FROM employees
WHERE department_id < 60
GROUP BY CUBE (department_id, job_id) ;
1
2
17-10 Copyright © Oracle Corporation, 2001. All rights
GROUPING Function
SELECT [column,] group_function(column) . ,
GROUPING(expr)
FROM table
[WHERE condition]
[GROUP BY [ROLLUP][CUBE] group_by_expression]
[HAVING having_expression]
[ORDER BY column];
• The GROUPING function can be used with either the
CUBE or ROLLUP operator.
• Using the GROUPING function, you can find the
groups forming the subtotal in a row.
• Using the GROUPING function, you can differentiate
stored NULL values from NULL values created by
ROLLUP or CUBE.
• The GROUPING function returns 0 or 1.
17-11 Copyright © Oracle Corporation, 2001. All rights
GROUPING Function: Example
SELECT department_id DEPTID, job_id JOB,
SUM(salary),
GROUPING(department_id) GRP_DEPT,
GROUPING(job_id) GRP_JOB
FROM employees
WHERE department_id < 50
GROUP BY ROLLUP(department_id, job_id);
1
2
17-12 Copyright © Oracle Corporation, 2001. All rights
GROUPING SETS
• GROUPING SETS are a further extension of the
GROUP BY clause.
• You can use GROUPING SETS to define multiple
groupings in the same query.
• The Oracle Server computes all groupings specified in
the GROUPING SETS clause and combines the results
of individual groupings with a UNION ALL operation.
• Grouping set efficiency:
– Only one pass over the base table is required.
– There is no need to write complex UNION statements.
– The more elements the GROUPING SETS have, the
greater the performance benefit.
17-13 Copyright © Oracle Corporation, 2001. All rights
GROUPING SETS: Example
SELECT department_id, job_id,
manager_id,avg(salary)
FROM employees
GROUP BY GROUPING SETS
((department_id,job_id), (job_id,manager_id));
1
…
17-15 Copyright © Oracle Corporation, 2001. All rights
Composite Columns
• A composite column is a collection of columns
that are treated as a unit.
ROLLUP (a,(b,c)
(b,c), d)
(b,c)
• To specify composite columns, use the GROUP BY
clause to group columns within parentheses so
that the Oracle server treats them as a unit while
computing ROLLUP or CUBE operations.
• When used with ROLLUP or CUBE, composite
columns would mean skipping aggregation across
certain levels.
17-17 Copyright © Oracle Corporation, 2001. All rights
Composite Columns: Example
SELECT department_id, job_id, manager_id,
SUM(salary)
FROM employees
GROUP BY ROLLUP( department_id,(job_id, manager_id));
2
1
…
3
17-19 Copyright © Oracle Corporation, 2001. All rights
Concatenated Groupings
• Concatenated groupings offer a concise way to
generate useful combinations of groupings.
• To specify concatenated grouping sets, you
separate multiple grouping sets, ROLLUP, and CUBE
operations with commas so that the Oracle Server
combines them into a single GROUP BY clause.
• The result is a cross-product of groupings from
each grouping set.
GROUP BY GROUPING SETS(a, b), GROUPING SETS(c, d)
17-21 Copyright © Oracle Corporation, 2001. All rights
Concatenated Groupings Example
SELECT department_id, job_id, manager_id,
SUM(salary)
FROM employees
GROUP BY department_id,
ROLLUP(job_id),
CUBE(manager_id);
1
…
2
…
3
…
4
17-22 Copyright © Oracle Corporation, 2001. All rights
Summary
In this lesson, you should have learned how to:
• Use the ROLLUP operation to produce
subtotal values
• Use the CUBE operation to produce cross-tabulation
values
• Use the GROUPING function to identify the row values
created by ROLLUP or CUBE
• Use the GROUPING SETS syntax to define multiple
groupings in the same query
• Use the GROUP BY clause, to combine expressions in
various ways:
– Composite columns
– Concatenated grouping sets
17-23 Copyright © Oracle Corporation, 2001. All rights
Practice 17 Overview
This practice covers the following topics:
• Using the ROLLUP operator
• Using the CUBE operator
• Using the GROUPING function
• Using GROUPING SETS
17-24 Copyright © Oracle Corporation, 2001. All rights