oracle 的分析函数有很多,但是这个函数总是会忘记,我想通过这种方式能让自己记起来,不至于下次还要百度。
创表、表数据(平时练手的表):
prompt PL/SQL Developer import fileprompt Created on 2018年7月5日 星期四 by Administratorset feedback offset define offprompt 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 loadedprompt Enabling triggers for CKX001...alter table CKX001 enable all triggers;set feedback onset define onprompt 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干净而又整洁。