SQL-几个做报表常用函数

近来工作遇到了有关统计报表相关的任务,所以这篇博客来说一下这方面的知识。为自己带来方便也为阅读这篇博客的同学带来便捷。

生成测试表

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;

说明

该篇博客希望从以上代码中学会如何使用代码中的函数。具体的说明在这里不介绍,读者可以根据运行结果检验相关函数的用法。

发布了23 篇原创文章 · 获赞 8 · 访问量 4117

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/103774946