近来工作遇到了有关统计报表相关的任务,所以这篇博客来说一下这方面的知识。为自己带来方便也为阅读这篇博客的同学带来便捷。
生成测试表
create or replace view v_ex(group_id,id,begintime,endtime,sal,ex_name) as
select 1,1,date'2019-11-01',date'2019-11-02',10,'A' from dual union all
select 1,2,date'2019-11-02',date'2019-11-03',20,'B' from dual union all
select 1,3,date'2019-11-03',date'2019-11-04',30,'C' from dual union all
select 1,4,date'2019-11-04',date'2019-11-05',40,'D' from dual union all
select 2,5,date'2019-11-06',date'2019-11-07',10,'E' from dual union all
select 2,6,date'2019-11-16',date'2019-11-17',20,'F' from dual union all
select 2,7,date'2019-11-17',date'2019-11-18',30,'G' from dual union all
select 3,8,date'2019-11-18',date'2019-11-19',40,'H' from dual union all
select 3,9,date'2019-11-19',date'2019-11-20',50,'I' from dual union all
select 3,10,date'2019-11-21',date'2019-11-22',10,'J' from dual union all
select 4,11,date'2019-11-26',date'2019-11-27',20,'K' from dual union all
select 4,12,date'2019-11-27',date'2019-11-28',30,'L' from dual union all
select 5,13,date'2019-11-28',date'2019-11-29',40,'M' from dual union all
select 5,14,date'2019-11-29',date'2019-11-30',50,'N' from dual;
运行代码1
select
group_id,
row_number() over(partition by group_id order by id) 分组加序号,
decode(row_number() over(partition by group_id order by id),1,'序号为1',2,'序号为2',3,'序号为3',4,'序号为4') 值替换,
(case row_number() over(partition by group_id order by id)
when 1 then '一'
when 2 then '二'
when 3 then '三'
when 4 then '四'
else '无'
end) 序号,
decode(group_id,row_number() over(partition by group_id order by id),0,1) 相等做标记0不等标记1,
id,
lead(begintime,2) over(order by id) begintime的后两行数据,
lead(begintime) over(order by id) begintime的后一行数据,
lead(begintime) over(partition by group_id order by id) 分组后的begintime的后一行数据,
begintime,
lag(begintime) over(partition by group_id order by id) 分组后的begintime的前一行数据,
lag(begintime) over(order by id) begintime的前一行数据,
lag(begintime,2) over(order by id) begintime的前两行数据,
endtime,
sal,
sum(sal) over(order by id) 求累计和,
sum(sal) over(partition by group_id order by id) 分组求累计和,
ex_name
from v_ex
运行代码2
with new_v_ex as
(select
group_id,
row_number() over(partition by group_id order by id) 分组加序号,
decode(row_number() over(partition by group_id order by id),1,'序号为1',2,'序号为2',3,'序号为3',4,'序号为4') 值替换,
(case row_number() over(partition by group_id order by id)
when 1 then '一'
when 2 then '二'
when 3 then '三'
when 4 then '四'
else '无'
end) 序号,
decode(group_id,row_number() over(partition by group_id order by id),0,1) 相等做标记0不等标记1,
id,
lead(begintime,2) over(order by id) begintime的后两行数据,
lead(begintime) over(order by id) begintime的后一行数据,
lead(begintime) over(partition by group_id order by id) 分组后的begintime的后一行数据,
begintime,
lag(begintime) over(partition by group_id order by id) 分组后的begintime的前一行数据,
lag(begintime) over(order by id) begintime的前一行数据,
lag(begintime,2) over(order by id) begintime的前两行数据,
endtime,
sal,
sum(sal) over(order by id) 求累计和,
sum(sal) over(partition by group_id order by id) 分组求累计和,
ex_name
from v_ex)
select listagg(ex_name,'/') within group(order by id) 分组合并字符串 from new_v_ex group by group_id;
说明
该篇博客希望从以上代码中学会如何使用代码中的函数。具体的说明在这里不介绍,读者可以根据运行结果检验相关函数的用法。