oracle 中怎么算sum分组取值/汇总值啊?一直没有头绪

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle 中怎么算sum分组取值/汇总值啊?一直没有头绪相关的知识,希望对你有一定的参考价值。

select a,sum(b) from dept
group a

现在有办法求出分组后sum(b)的值占总sum(b)值的比例么

oracle中sum分组取值/汇总值用如下方法。

如emp表中有如下数据:

现要按deptno分组,求每组中sal的值/汇总值,可用如下语句:

select deptno,sum(sal)/(select sum(sal) from emp) from emp group by deptno;

查询结果:

参考技术A select a,sum(b),sum(b)/(select sum(b) from dept) from dept
group a
参考技术B SELECT
RATIO_TO_REPORT(SUM(b)) OVER() AS "所占百分比",
a,
SUM(b)
FROM
dept
GROUP BY
a;本回答被提问者采纳
参考技术C 用分析函数sum() over。 参考技术D select a,sum(b)/(select sum(b) from dept) from dept
group a

Oracle 分析函数的汇总

Oracle 分析函数的汇总

这里主要整理over()的分析函数组合

测试数据

create table students
(id number(15,0),
area varchar2(10),
stu_type varchar2(2),
score number(20,2));
insert into students values(1, '111', 'g', 80 );
insert into students values(1, '111', 'j', 80 );
insert into students values(1, '222', 'g', 89 );
insert into students values(1, '222', 'g', 68 );
insert into students values(2, '111', 'g', 80 );
insert into students values(2, '111', 'j', 70 );
insert into students values(2, '222', 'g', 60 );
insert into students values(2, '222', 'j', 65 );
insert into students values(3, '111', 'g', 75 );
insert into students values(3, '111', 'j', 58 );
insert into students values(3, '222', 'g', 58 );
insert into students values(3, '222', 'j', 90 );
insert into students values(4, '111', 'g', 89 );
insert into students values(4, '111', 'j', 90 );
insert into students values(4, '222', 'g', 90 );
insert into students values(4, '222', 'j', 89 );
commit;

1.DENSE_RANK() over()

允许并列名次、名次不间断,DENSE_RANK(),结果如122344456……

--将score按ID分组排名
dense_rank() over(partition by id order by score desc)
--将score不分组排名:
dense_rank() over(order by score desc)
--测试
select id,area,score,
dense_rank() over(partition by id order by score desc) rn1 ,--分组id排序,
dense_rank() over(order by score desc) rn2--不分组排序
from students order by id,area;
2.ROW_NUMBER() over()

不允许并列名次、相同值名次不重复,ROW_NUMBER(),结果如123456……

--将score按ID分组排名:
row_number() over(partition by id order by score desc)
--将score不分组排名:
row_number() over(order by score desc)
--测试
select id,area,score,
row_number() over(partition by id order by score desc) rn1 ,--分组id排序,
row_number() over(order by score desc) rn2 --不分组排序
from students order by id,area;
3.rank() over()

允许并列名次、复制名次自动空缺,rank(),结果如12245558……

--将score按ID分组排名:
rank() over(partition by id order by score desc)
--将score不分组排名:
rank() over(order by score desc)
--测试
select id,area,score,
rank() over(partition by id order by score desc) rn1, --分组id排序,
rank() over(order by score desc) rn2 --不分组排序
from students order by id,area;
4.cume_dist() over()

名次分析,cume_dist()——-最大排名/总个数

用来分析目标在对应整体水平中的占比

如a根据id进行正序排列,所以id小的占比小,id大的占比大(体现了当前值在整体中的水平)

--函数:
cume_dist() over(order by id)
--测试
select id,area,score,
cume_dist() over(order by id) a, --按ID最大排名/总个数 
cume_dist() over(partition by id order by score desc) b, --ID分组中,scroe最大排名值/本组总个数
row_number() over (order by id) --记录号
from students order by id,area;
5.分组统计-sum() over()
select id,area,score,
sum(1) over() as 总记录数, 
sum(1) over(partition by id) as 分组记录数,
sum(score) over() as 总计 , 
sum(score) over(partition by id) as 分组求和,
sum(score) over(order by id) as  分组连续求和,
sum(score) over(partition by id,area) as 分组ID和area求和,
sum(score) over(partition by id order by area) as 分组ID并连续按area求和
from students;

6.分组统计-max() over()
select id,area,score,
max(score) over() as 最大值,
max(score) over(partition by id) as 分组最大值,
max(score) over(order by id) as 分组连续最大值,
max(score) over(partition by id,area) as 分组ID和area求最大值,
max(score) over(partition by id order by area) as 分组ID并连续按area求最大值
from students;

7.分组统计-avg() over()
select id,area,score,
avg(score) over() as 所有平均,
avg(score) over(partition by id) as 分组平均,
avg(score) over(order by id) as 分组连续平均,
avg(score) over(partition by id,area) as 分组ID和area平均,
avg(score) over(partition by id order by area) as 分组ID并连续按area平均
from students;

8.分组统计-RATIO_TO_REPORT() over()

类似于 score/sum(score)

select id,area,score,
RATIO_TO_REPORT(score) over() as "占所有%",
RATIO_TO_REPORT(score) over(partition by id) as "占分组%",
from students;

9.LAG(COL,n,default) over()
--取前后边N条数据
--取前面记录的值:lag(score,n,x) over(order by id) 取当前行前面第N条数据的score字段,如果为空,取x
select id,
	   lag(score,1,0) over(order by id) lg,
	   score 
from students;
10.LEAD(COL,n,default) over()
--取后边N条数据
--取后面记录的值:lead(score,n,x) over(order by id)  取当前行后面第N条数据的score字段,如果为空,取x
select id,
	   lead(score,1,0) over(order by id) lg,
	   score 
from students;
11.FIRST_VALUE() over()
--取第起始1行值:first_value(score,n) over(order by id)
select id,first_value(score) over(order by id) fv,score from students;
12.LAST_VALUE() over()
--取第最后1行值:LAST_value(score,n) over(order by id)
select id,last_value(score) over(order by id) lv,score from students;

以上是关于oracle 中怎么算sum分组取值/汇总值啊?一直没有头绪的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 分析函数的汇总

在ORACLE中GROUP BY 中包含了汇总的字段会出现啥情况?

分析函数系列之sum(col1) over(partition by col2 order by col3):实现分组汇总或递增汇总

关于C#中group by如何实现多条件分组汇总

我要用oracle根据我截取到的年龄分组,查询显示其它字段,但是不用max(),sum()等聚合函数

oracle求和问题,不要分组条件,只要求和