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干凈而又整潔。