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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM