標籤:表資料 comm name feedback 方法 delete tab init prompt
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乾淨而又整潔。
oracle 分析函數——ration_to_report 求佔有率(百分比)