--1.首先创建一个表
--drop table TE;
create table TE
(
ID VARCHAR2(2),
T_CODE VARCHAR2(4),
T_NAME VARCHAR2(4),
T_AMOUNT number(10),
T_DEPT VARCHAR2(4),
T_PROJECT VARCHAR2(4),
T_TYPE VARCHAR2(1)
);
--2.测试数据
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('1', '1', '1', 10, '总部', '90', '0');
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('2', '2', '2', 20, '总部', '70', '0');
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('3', '3', '3', 30, '分1', '60', '0');
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('4', '4', '4', 40, '分1', '50', '0');
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('5', '5', '5', 50, '分2', '40', '0');
insert into te (ID, T_CODE, T_NAME, T_AMOUNT, T_DEPT, T_PROJECT, T_TYPE)
values ('6', '6', '6', 60, '分2', '30', '0');
--3.查询
select * from te;
--4.分组统计
select t.t_dept, t.t_project, sum(t.t_amount) from te t
group by t.t_dept, t.t_project;
--5.用t.t_dept, t.t_project,并使用t.t_dept来做小计
select t.t_dept, t.t_project, sum(t.t_amount) from te t
group by grouping sets ((t.t_dept, t.t_project), t.t_dept);
--6.用t.t_dept, t.t_project,并使用t.t_dept来做小计,并做一次总计
select t.t_dept, t.t_project, sum(t.t_amount) from te t
group by grouping sets ((t.t_dept, t.t_project), t.t_dept, null);
--7.使用grouping(字段)
select grouping(t.t_dept),grouping(t.t_project),t.t_dept, t.t_project, sum(t.t_amount) from te t
group by grouping sets ((t.t_dept, t.t_project), t.t_dept, null);
--8.合计
select
case when grouping(t.t_dept)=1 and grouping(t.t_project)=1 then
'合计:'
when grouping(t.t_dept)=0 and grouping(t.t_project)=1 then
'分组小计:'
else
t.t_dept
end t_dept,
case when grouping(t.t_dept)=0 and grouping(t.t_project)=0 then
t.t_project
else
'0'
end t_project,
sum(t.t_amount) count
from te t
group by grouping sets ((t.t_dept, t.t_project), t.t_dept, null);
--9.分组
select
case when t.t_dept is null and t.t_project is null then
'合计'
else
t.t_dept
end t_dept,
case when t.t_dept is null and t.t_project is null then
'0'
when t.t_dept is not null and t.t_project is null then
'分组小计:'
else
t.t_dept
end t_dept,
sum(t.t_amount) count
from te t
group by grouping sets ((t.t_dept, t.t_project), t.t_dept, null);