1)创建测试表group_testsec@ora10g> create table group_test (group_id int, job varchar2(10), name varchar2(10), salary int);Table created.2)初始化数据insert into group_test values (10,'Coding', 'Bruce',1000);insert into group_test values (10,'Programmer','Clair',1000);insert into group_test values (10,'Architect', 'Gideon',1000);insert into group_test values (10,'Director', 'Hill',1000);insert into group_test values (20,'Coding', 'Jason',2000);insert into group_test values (20,'Programmer','Joey',2000);insert into group_test values (20,'Architect', 'Martin',2000);insert into group_test values (20,'Director', 'Michael',2000);insert into group_test values (30,'Coding', 'Rebecca',3000);insert into group_test values (30,'Programmer','Rex',3000);insert into group_test values (30,'Architect', 'Richard',3000);insert into group_test values (30,'Director', 'Sabrina',3000);insert into group_test values (40,'Coding', 'Samuel',4000);insert into group_test values (40,'Programmer','Susy',4000);insert into group_test values (40,'Architect', 'Tina',4000);insert into group_test values (40,'Director', 'Wendy',4000);commit;3)初始化之后的数据情况如下:sec@ora10g> select * from group_test; GROUP_ID JOB NAME SALARY---------- ---------- ---------- ---------- 10 Coding Bruce 1000 10 Programmer Clair 1000 10 Architect Gideon 1000 10 Director Hill 1000 20 Coding Jason 2000 20 Programmer Joey 2000 20 Architect Martin 2000 20 Director Michael 2000 30 Coding Rebecca 3000 30 Programmer Rex 3000 30 Architect Richard 3000 30 Director Sabrina 3000 40 Coding Samuel 4000 40 Programmer Susy 4000 40 Architect Tina 4000 40 Director Wendy 400016 rows selected.2.先看一下普通分组的效果:对group_id进行普通的group by操作---按照小组进行分组sec@ora10g> select group_id,sum(salary) from group_test group by group_id; GROUP_ID SUM(SALARY)---------- ----------- 30 12000 20 8000 40 16000 10 40003.对group_id进行普通的roolup操作---按照小组进行分组,同时求总计sec@ora10g> select group_id,sum(salary) from group_test group by rollup(group_id); GROUP_ID SUM(SALARY)---------- ----------- 10 4000 20 8000 30 12000 40 16000 40000翻译一下上面的SQL语句如下(union all一个统计所有数据的行):sec@ora10g> select group_id,sum(salary) from group_test group by group_id 2 union all 3 select null, sum(salary) from group_test 4 order by 1; GROUP_ID SUM(SALARY)---------- ----------- 10 4000 20 8000 30 12000 40 16000 400004.再看一个rollup两列的情况sec@ora10g> select group_id,job,sum(salary) from group_test group by rollup(group_id, job); GROUP_ID JOB SUM(SALARY)---------- ---------- ----------- 10 Coding 1000 10 Director 1000 10 Architect 1000 10 Programmer 1000 10 4000 20 Coding 2000 20 Director 2000 20 Architect 2000 20 Programmer 2000 20 8000 30 Coding 3000 30 Director 3000 30 Architect 3000 30 Programmer 3000 30 12000 40 Coding 4000 40 Director 4000 40 Architect 4000 40 Programmer 4000 40 16000 4000021 rows selected.上面的SQL语句该如何翻译呢?如下:sec@ora10g> select group_id,job,sum(salary) from group_test group by group_id, job 2 union all 3 select group_id,null,sum(salary) from group_test group by group_id 4 union all 5 select null,null,sum(salary) from group_test 6 order by 1,2; GROUP_ID JOB SUM(SALARY)---------- ---------- ----------- 10 Architect 1000 10 Coding 1000 10 Director 1000 10 Programmer 1000 10 4000 20 Architect 2000 20 Coding 2000 20 Director 2000 20 Programmer 2000 20 8000 30 Architect 3000 30 Coding 3000 30 Director 3000 30 Programmer 3000 30 12000 40 Architect 4000 40 Coding 4000 40 Director 4000 40 Programmer 4000 40 16000 4000021 rows selected.5.补充一步,尝试一下grouping直接看效果就OK了:sec@ora10g> select group_id,job,grouping(GROUP_ID),grouping(JOB),sum(salary) from group_test group by rollup(group_id, job); GROUP_ID JOB GROUPING(GROUP_ID) GROUPING(JOB) SUM(SALARY)---------- ---------- ------------------ ------------- ----------- 10 Coding 0 0 1000 10 Director 0 0 1000 10 Architect 0 0 1000 10 Programmer 0 0 1000 10 0 1 4000 20 Coding 0 0 2000 20 Director 0 0 2000 20 Architect 0 0 2000 20 Programmer 0 0 2000 20 0 1 8000 30 Coding 0 0 3000 30 Director 0 0 3000 30 Architect 0 0 3000 30 Programmer 0 0 3000 30 0 1 12000 40 Coding 0 0 4000 40 Director 0 0 4000 40 Architect 0 0 4000 40 Programmer 0 0 4000 40 0 1 16000 1 1 4000021 rows selected.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/165278/viewspace-611087/
,如需转载,请注明出处,否则将追究法律责任。