zoukankan      html  css  js  c++  java
  • 物资项目数据处理

    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'SIMPLE_CALC' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE simple_calc'; 
          END IF; 
    END; 
    /
    --计算平均值、方差、离散系数
    create table simple_calc as 
    select t.matlcode,
           avg(t.taxprice) as junz,
           STDDEV(t.taxprice) biaozc,
           STDDEV(t.taxprice) / avg(t.taxprice) lisxs
      from T_WLCG_ZZCL_130W_X t
     group by t.matlcode;
    
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'BEYOND_YEAR_OF_16' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE beyond_year_of_16'; 
          END IF; 
    END; 
    /
    --2016年以后还有数据的表
    create  table beyond_year_of_16 as ( 
     select t1.*
       from T_WLCG_ZZCL_130W_X t1
      right join (select t.matlcode
                    from T_WLCG_ZZCL_130W_X t
                   group by t.matlcode
                  having max(to_char(t.deliverydate,'yyyy')) >= 2016) t2 on t1.matlcode =
                                                            t2.matlcode
    );
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'NOT_BEYOND_YEAR_OF_16' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE not_beyond_year_of_16'; 
          END IF; 
    END; 
    /
    --2016年以后没有数据的表
    create  table not_beyond_year_of_16 as ( 
     select t1.*
       from T_WLCG_ZZCL_130W_X t1 right join 
            (select t.matlcode
               from T_WLCG_ZZCL_130W_X t
              group by t.matlcode
             having max(to_char(t.deliverydate,'yyyy')) < 2016) t2
      on t1.matlcode = t2.matlcode
    );
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'BEYOND_YEAR_OF_16_2RD' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE beyond_year_of_16_2rd'; 
          END IF; 
    END; 
    /
    --两次筛选之后的数据(物料日单价异常值过滤:
    --1、物料单价:(物料均价-3倍标准差,物料均价+3倍标准差)
    --3、物料日单价的离散系数<0.5)
    create table beyond_year_of_16_2rd as 
    select t1.*
      from (select t1.*
              from beyond_year_of_16 t1
             right join simple_calc t2 on t1.matlcode = t2.matlcode and
                                          t1.taxprice between
                                          t2.junz - 3 * t2.biaozc and
                                          t2.junz + 3 * t2.biaozc and
                                          t2.lisxs < 0.5) t1
      right join (select t.matlcode,
           avg(t.taxprice),
           STDDEV(t.taxprice) biaozc2,
           STDDEV(t.taxprice) / avg(t.taxprice) lisxs2
      from (select t1.*
              from beyond_year_of_16 t1
             right join simple_calc t2 on (t1.matlcode = t2.matlcode and
                                          t1.taxprice between
                                          t2.junz - 3 * t2.biaozc and
                                          t2.junz + 3 * t2.biaozc and
                                          t2.lisxs < 0.5)) t
     group by t.matlcode) t2 on (t1.matlcode = t2.matlcode
                                         and t1.taxprice between
                                             t1.taxprice - 3 * t2.biaozc2 and
                                             t1.taxprice + 3 * t2.biaozc2);                     
    
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'BEYOND_YEAR_OF_16_2RD_BIG15' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE beyond_year_of_16_2rd_big15'; 
          END IF; 
    END; 
    /
     --历史采购数量大于15条的种类所有字段建表语句
    create table beyond_year_of_16_2rd_big15 as 
    select t2.*
      from beyond_year_of_16_2rd t2
     right join (select t1.matlcode
                   from (select t.matlcode, t.deliverydate
                           from beyond_year_of_16_2rd t
                          group by t.matlcode, t.deliverydate) t1
                  group by t1.matlcode
                 having count(t1.matlcode) >=15) t3 on t2.matlcode =
                                                       t3.matlcode;
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'g_model_data' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE g_model_data'; 
          END IF; 
    END; 
    /
    --包含平均价格
    create table g_model_data as  
    select t1.*,t2.avg_price
     from beyond_year_of_16_2rd_big15 t1 left join (select avg(taxprice) avg_price,matlcode from beyond_year_of_16_2rd_big15 group by matlcode) t2 on t1.matlcode=t2.matlcode;                  
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'g_jstt' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE g_jstt'; 
          END IF; 
    END; 
    /
    -- 技术淘汰物料
    create table g_jstt as  
    select t.big_class_name,
           t.mid_class_name,
           t.small_class_name,
           t.mat_desc,
           t.unit_name,
           t.bidplancode,
           t.compname,
           t.matlcode,
           t.deliverydate,
           avg(t.taxprice) taxprice
      from not_beyond_year_of_16 t
     group by t.big_class_name,
              t.mid_class_name,
              t.small_class_name,
              t.matlcode,
              t.mat_desc,
              t.unit_name,
              t.bidplancode,
              t.compname,
              t.matlcode,
              t.deliverydate;  
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'NOT_MODEL_DATA_BASE' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE not_model_data_base'; 
          END IF; 
    
    END; 
    /
    --非建模数据
    --基础表(日价格)
     create  table not_model_data_base as 
    select t.BIG_CLASS_NAME,
           t.MID_CLASS_NAME,
           t.SMALL_CLASS_NAME,
           t.MATLCODE,
           t.MAT_DESC,
           t.UNIT_NAME,
           avg(t.TAXPRICE) TAXPRICE,
           t.DELIVERYDATE
      from (select *
              from beyond_year_of_16 t1
             where t1.matlcode not in
                   (select t2.matlcode from beyond_year_of_16_2rd_big15 t2)) t
     group by t.BIG_CLASS_NAME,
              t.MID_CLASS_NAME,
              t.SMALL_CLASS_NAME,
              t.MATLCODE,
              t.MAT_DESC,
              t.UNIT_NAME,
              t.DELIVERYDATE;
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'CALC_TJ' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE calc_tj'; 
          END IF; 
    END; 
    /
    --计算平均值、方差、中位数
    create table calc_tj as 
    select t.matlcode,
           avg(t.taxprice) as junz,
           STDDEV(t.taxprice) biaozc,
           MEDIAN(t.taxprice) mid_dailyprice
      from not_model_data_base t
     group by t.matlcode;
     
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'NOT_MODEL_NO_YIC' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE not_model_no_yic'; 
          END IF; 
    END; 
    
    /
    -- 异常值过滤
    create table not_model_no_yic as
    select t1.*
      from not_model_data_base t1
     right join calc_tj t2 on t1.matlcode = t2.matlcode
                          and t1.taxprice between t2.junz - 3 * t2.biaozc and
                              t2.junz + 3 * t2.biaozc
                          and t1.taxprice between t2.mid_dailyprice / 5 and
                              t2.mid_dailyprice * 5;
    --插入最新日期
    insert into not_model_no_yic
      (BIG_CLASS_NAME,
       MID_CLASS_NAME,
       SMALL_CLASS_NAME,
       MATLCODE,
       MAT_DESC,
       UNIT_NAME,
       TAXPRICE,
       DELIVERYDATE)
      select BIG_CLASS_NAME,
             MID_CLASS_NAME,
             SMALL_CLASS_NAME,
             MATLCODE,
             MAT_DESC,
             UNIT_NAME,
             TAXPRICE,
             DELIVERYDATE
        from (select t1.*,
                     null taxprice,
                    to_date(to_char(sysdate,'yyyy-mm-dd'),'yyyy-mm-dd') DELIVERYDATE
                from (select distinct t.big_class_name,
                                      t.mid_class_name,
                                      t.small_class_name,
                                      t.matlcode,
                                      t.mat_desc,
                                      t.unit_name
                        from not_model_no_yic t) t1);
    commit;  
    
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'BEFORE_3RD_DATA' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE before_3rd_data'; 
          END IF; 
    END; 
    /            
    --3次前的数据
    create table before_3rd_data as 
    select t.matlcode,t.taxprice taxprice, 
           lag(t.taxprice, 1, null) over(partition by t.matlcode order by t.deliverydate) before_1p,
           lag(t.taxprice, 2, null) over(partition by t.matlcode order by t.deliverydate) before_2p,
           lag(t.taxprice, 3, null) over(partition by t.matlcode order by t.deliverydate) before_3p,
           lag(t.deliverydate, 1, null) over(partition by t.matlcode order by t.deliverydate)-t.deliverydate before_1t,
           lag(t.deliverydate, 2, null) over(partition by t.matlcode order by t.deliverydate)-t.deliverydate before_2t,
           lag(t.deliverydate, 3, null) over(partition by t.matlcode order by t.deliverydate)-t.deliverydate before_3t,
            t.deliverydate,t.big_class_name,t.mid_class_name,t.small_class_name,t.mat_desc,t.unit_name
    from not_model_no_yic t
         order by t.deliverydate asc; 
    
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'NOT_MODEL_WITH_PRIDICT' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE not_model_with_pridict'; 
          END IF; 
    END; 
    /
    --带有预测价格的数据
    create table not_model_with_pridict as 
    select t1.big_class_name,t1.mid_class_name,t1.small_class_name,t1.matlcode,t1.mat_desc,t1.unit_name,t1.taxprice,
    (case
             when t1.before_1p is null then
              t1.taxprice
             when t1.before_2p is null then
              t1.before_1p
             when t1.before_3p is null then
              (1 / t1.before_2t * t1.before_2p + 1 / t1.before_1t * t1.before_1p) /
              (1 / t1.before_2t + 1 / t1.before_1t)
             else
              (1 / t1.before_2t * t1.before_2p + 1 / t1.before_1t * t1.before_1p +
              1 / t1.before_3t * t1.before_3p) /
              (1 / t1.before_2t + 1 / t1.before_1t + 1 / t1.before_3t)
           end) as predict_price,t1.deliverydate
      from before_3rd_data t1 order by t1.matlcode;   
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'g_not_model' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE g_not_model'; 
          END IF; 
    END; 
    /  
    --  非建模数据最终版      
    create table g_not_model as 
    select a.*,
           least(a.predict_price + 3 * b.taxprice_std, b.taxprice_max) taxprice_up,
           GREATEST(a.predict_price - 3 * b.taxprice_std, b.taxprice_min) taxprice_low,
           1 - abs((a.taxprice - a.predict_price) / a.taxprice) percision
      from (select * from not_model_with_pridict) a
      left join (select t1.matlcode,
                        min(t1.taxprice) TAXPRICE_MIN,
                        max(t1.taxprice) TAXPRICE_MAX,
                        stddev(t1.taxprice) TAXPRICE_STD
                   from not_model_with_pridict t1
                  group by t1.matlcode) b on a.matlcode = b.matlcode; 
    alter table  g_not_model add if_predict    varchar2(10) default '拟合';
    update g_not_model set if_predict='预测'  where taxprice is null;
    commit;
    
          
                               
    

      

    --创建日期维度表脚本
    DECLARE
      NUM NUMBER;
    BEGIN
      SELECT COUNT(1)
        INTO NUM
        FROM ALL_TABLES
       WHERE TABLE_NAME = 'TIME_DIMENSION';
      IF NUM = 1 THEN
        EXECUTE IMMEDIATE 'DROP TABLE TIME_DIMENSION';
      END IF;
    END;
    / 
    create table TIME_DIMENSION(the_date varchar2(10),
                                  the_year varchar2(4),
                                  the_quarter VARCHAR2(10),
                                  the_month varchar2(2));
    DECLARE
      dDate         date;
      v_the_date    varchar2(10);
      v_the_year    varchar2(4);
      v_the_quarter varchar2(10);
      v_the_month   varchar2(2);
      begin_date    varchar2(10);
      end_date      varchar2(10);
      adddays       int;
    BEGIN
      select to_char(max(DATE_DAY), 'yyyymmdd') into end_date from T_YSJS;
      select to_char(min(DATE_DAY), 'yyyymmdd') into begin_date from T_YSJS;
      adddays := 1;
      dDate   := to_date(begin_date, 'yyyymmdd');
    
      WHILE (dDate <= to_date(end_date, 'yyyymmdd')) loop
        v_the_date    := to_char(dDate, 'yyyymmdd'); --key值
        v_the_year    := to_char(dDate, 'yyyy'); --年
        v_the_quarter := to_char(dDate, 'q'); --季度
        v_the_month   := to_char(dDate, 'mm'); --月份(字符型)
        insert into time_dimension
          (the_date, the_year, the_quarter, the_month)
        values
          (v_the_date, v_the_year, v_the_quarter, v_the_month);
        dDate := dDate + adddays;
      END loop;
    end;
    / 
    commit;
    DECLARE 
          NUM NUMBER; 
    BEGIN 
          SELECT COUNT(1) INTO NUM FROM ALL_TABLES WHERE TABLE_NAME = 'G_OUTERDATA' ; 
          IF NUM=1 THEN 
              EXECUTE IMMEDIATE 'DROP TABLE G_OUTERDATA'; 
          END IF; 
    END; 
    / 
    create table G_OUTERDATA as 
    select t11.*, t12.SNZS
      from (select t9.*, t10.CU, t10.AL, t10.PB, t10.ZN, t10.Q
              from (select t7.*, t8.PPI
                      from (select t5.*, t6.PMI
                              from (select t3.*, t4.gdp_gy
                                      from (select t1.*, t2.salary
                                              from TIME_DIMENSION t1
                                              left join T_SALARY t2 on t1.the_year =
                                                                       t2.year) t3
                                      left join T_GDP_GY t4 on t3.the_year =
                                                               t4.year
                                                           and t3.the_quarter =
                                                               t4.quarter) t5
                              left join T_PMI t6 on t5.the_year =
                                                    to_char(t6.date_day, 'yyyy')
                                                and t5.the_month =
                                                    to_char(t6.date_day, 'mm')) t7
                      left join T_PPI t8 on t7.the_year =
                                            to_char(t8.date_day, 'yyyy')
                                        and t7.the_month =
                                            to_char(t8.date_day, 'mm')) t9
              left join T_YSJS t10 on t9.the_date =
                                      to_char(t10.date_day, 'yyyymmdd')) t11
      left join T_SNZS t12 on t11.the_date = to_char(t12.date_day, 'yyyymmdd');
    

      

  • 相关阅读:
    大话设计模式笔记(十三)の状态模式
    大话设计模式笔记(十二)の抽象工厂模式
    大话设计模式笔记(十一)の观察者模式
    大话设计模式笔记(十)の建造者模式
    大话设计模式笔记(九)の外观模式
    大话设计模式笔记(八)の模板方法模式
    大话设计模式笔记(七)の原型模式
    Vue(十二):自定义指令和函数渲染
    Vue(十一):组件边界
    Vue(十):混入、插件和过滤器
  • 原文地址:https://www.cnblogs.com/jycjy/p/9134579.html
Copyright © 2011-2022 走看看