René Nyffenegger's collection of things on the web | |
René Nyffenegger on Oracle - Most wanted - Feedback
- Follow @renenyffenegger
|
Oracle SQL: GROUP BY and ROLLUP | ||
A select <aggregate function>, column_1, column_2, ... column_n group by
rollup(column_1, column_2, ... column_n) statement can be written as:
select aggr_out, column_1, column_2, .... column_n from ( select aggr_func(some_column) aggr_out, column_1, column_2, ... column_n group by (column_1, column_2, ... column_n) union all select aggr_func(some_column) aggr_out, column_1, column_2, ... null group by (column_1, column_2, ... null) union all select aggr_func(some_column) aggr_out, column_1, null, ... null group by (column_1, null, ... null) union all select aggr_func(some_column) aggr_out ) order by column_1, column_2, ..., column_n
This will be demonstrated with the following SQL statements.
First, a table (named test_groupby) is created:
set feedback off set pagesize 0 create table test_groupby ( n number, a char(1), b char(1), c char(1) );
Some values inserted:
insert into test_groupby values ( 4 , 'z','t', 'm'); insert into test_groupby values ( 7 , 'z','t', 'm'); insert into test_groupby values ( 5 , 'a','u', 'm'); insert into test_groupby values (11 , 'm','v', 's'); insert into test_groupby values ( 1 , 'r','w', 's'); insert into test_groupby values ( 2 , 'a','u', 'm'); insert into test_groupby values ( 9 , 'a','d', 'm'); insert into test_groupby values ( 8 , 'a','u', 'r'); insert into test_groupby values ( 2 , 'r','w', 'u'); insert into test_groupby values ( 4 , 'z','t', 'm'); insert into test_groupby values ( 1 , 'm','d', 'b'); create view vw_1 as select sum(n) s, a, b, c from test_groupby group by a, b, c; create view vw_2 as select sum(n) s, a, b, null c from test_groupby group by a, b, null; create view vw_3 as select sum(n) s, a, null b, null c from test_groupby group by a, null, null; create view vw_4 as select sum(n) s, null a, null b, null c from test_groupby; select * from vw_1; 8 a u r 9 a d m 2 r w u 7 a u m 15 z t m 1 m d b 1 r w s 11 m v s select * from vw_2; 3 r w 15 a u 15 z t 11 m v 1 m d 9 a d select * from vw_3; 24 a 3 r 15 z 12 m select * from vw_4; 54 select s, a, b, c from ( select * from vw_1 union all select * from vw_2 union all select * from vw_3 union all select * from vw_4 ) order by a, b, c; 9 a d m 9 a d 7 a u m 8 a u r 15 a u 24 a 1 m d b 1 m d 11 m v s 11 m v 12 m 1 r w s 2 r w u 3 r w 3 r 15 z t m 15 z t 15 z 54 select sum(n), a, b, c from test_groupby group by rollup (a, b, c); 9 a d m 9 a d 7 a u m 8 a u r 15 a u 24 a 1 m d b 1 m d 11 m v s 11 m v 12 m 1 r w s 2 r w u 3 r w 3 r 15 z t m 15 z t 15 z 54
Cleaning up:
drop view vw_4; drop view vw_3; drop view vw_2; drop view vw_1; drop table test_groupby; Links
See also grouping and grouping_id.
|