oracle 分析函数——ration_to_report 求占有率(百分比)
oracle 的分析函数有很多,但是这个函数总是会忘记,我想通过这种方式能让自己记起来,不至于下次还要百度。
创表、表数据(平时练手的表):
prompt PL/SQL Developer import file prompt Created on 2018年7月5日 星期四 by Administrator set feedback off set define off prompt Creating CKX001... create table CKX001 ( ID VARCHAR2(20) not null, NAME VARCHAR2(20) not null, SEX VARCHAR2(20) not null, SARL VARCHAR2(20), ADDRESS VARCHAR2(500), TIME DATE ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 8K minextents 1 maxextents unlimited ); prompt Disabling triggers for CKX001... alter table CKX001 disable all triggers; prompt Deleting CKX001... delete from CKX001; commit; prompt Loading CKX001... insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('004', '周润发', '1', '2000', '广场', null); insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('005', '周星驰', '1', '1500', '商场', null); insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('006', '梁朝伟', '1', '1700', '大街', null); insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('001', '杨千嬅', '2', '2000', null, to_date('15-05-2018 10:54:19', 'dd-mm-yyyy hh24:mi:ss')); insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('002', '张柏芝', '2', '1000', '中心公园', to_date('15-05-2018 10:54:19', 'dd-mm-yyyy hh24:mi:ss')); insert into CKX001 (ID, NAME, SEX, SARL, ADDRESS, TIME) values ('003', '黎姿', '2', '1200', '河马公寓', to_date('12-05-2018 10:54:44', 'dd-mm-yyyy hh24:mi:ss')); commit; prompt 6 records loaded prompt Enabling triggers for CKX001... alter table CKX001 enable all triggers; set feedback on set define on prompt Done.
现在我们要查询每个人的工资占平均工资的百分比:
不会用ration_to_reropt的时候总是要用笨的方法,因为我们要求出每个人占总工资的百分比首先要的到总工资,然后在那每个人的去除得到,
类似:
select name,round(sarl/(select sum(sarl) from ckx001),4)*100||'%' salratio from ckx001;
效果虽然能够达到,但是我们像没有想过实际开发中的数据是来自没多张表,就像做过一个扯蛋的需求,数据来自人员信息表和其他十八张档案表的这种设计,
其实还是当初表设计的人脑子里有坑,虽然十八章表字段有所不同,课大部分完全可以设计到一张表去,然后用一个档案Type的字段去区分就好了,跑偏了,
总之我要说的是这个求百分比的SQL可能基准数据来的就非常困难,并不想我们例子上这个是来自一张表,所以也就很easy,我当时也就是看到自己恶心的SQL
时想简化他,最起码要美观简洁,偶尔也可以装个逼。
像这样:
select name,round(ratio_to_report(sarl) over(),4)*100||'%' salratio from ckx001;
上下两条SQL的效果是一样的,但是党我们的基础数据来自很复杂的sql是,下面这种分析函数的使用会让你的SQL干净而又整洁。