zoukankan      html  css  js  c++  java
  • 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干净而又整洁。

  • 相关阅读:
    iframe跨域访问
    Discuz教程:X3.1-x3.2后台admin.php防止直接恶意访问
    JS打开新窗口的2种方式
    怎么让alert弹出框的内容可以换行?
    php判断IE浏览器
    一个表单的多按钮提交
    document.form.command.value
    如何区分处理两个提交按钮
    javascript window.confirm确认 取消对话框实现代码小结
    asp.net mvc 在View中获取Url参数的值
  • 原文地址:https://www.cnblogs.com/ckxlovejava/p/9270560.html
Copyright © 2011-2022 走看看