Oracle常用处理函数

处理分母为0的情况

       decode(sales_num,0,0,total_price/sales_num) 

特定字符串前后数据

--之前的得到AAA

      select substr('AAA-BBB',1,instr('AAA-BBB','-',-1)-1) 值 from dual;
--之后的得到BBB    
      select substr('AAA-BBB',instr('AAA-BBB','-',-1)+1,length('AAA-BBB')) 值 from dual;

多行数据合并

特别注意:这个函数不去重,在聚合前必须先去重

数值的话sum()   group  by

,LISTAGG (T1.PROD_NM || ' ' ||
        CASE WHEN T2.PLAN_OPEN_TIME_INV <= T2.ACTL_OPEN_TIME -- 正常开盘,延后开盘
             AND TO_CHAR( T1.CNTRT_DTTM, 'YYYYMM' ) = TO_CHAR( T2.ACTL_OPEN_TIME, 'YYYYMM' ) THEN decode(T1.CNTRT_AREA ,0,0,T1.CNTRT_AMT/T1.CNTRT_AREA )
        WHEN T2.PLAN_OPEN_TIME_INV > T2.ACTL_OPEN_TIME -- 抢开盘
             AND TO_CHAR( T1.CNTRT_DTTM, 'YYYYMM' ) BETWEEN TO_CHAR( T2.ACTL_OPEN_TIME, 'YYYYMM' ) 
             AND TO_CHAR( T2.PLAN_OPEN_TIME_INV, 'YYYYMM' ) 
        THEN
            decode(T1.CNTRT_AREA ,0,0,T1.CNTRT_AMT/T1.CNTRT_AREA ) ELSE 0 END,           -- 去化货值/去化面积  首开各物业类型均价
                   '; ')
WITHIN GROUP ( ORDER BY T2.PROJ_ID ) AS FIRST_AVG_PRICE_YETAI -- 去化货值/去化面积  首开各物业类型均价

一个字段中的多条数据拆分

select 
    trim(substr(STR,1,instr(STR,' ',-1)-1)) prod_nm,
    trim(substr(STR,instr(STR,' ',-1)+1,length(STR))) prod_num
from 
SELECT NVL(REGEXP_SUBSTR('住宅-高层(19-34层)-精装-可售-常规 58345.26; 住宅-中高层(12-18层)-精装-可售-常规 61928.87', '[^;]+', 1, LEVEL, 'i'), 'NULLL') AS STR
FROM DUAL   CONNECT BY LEVEL <= 7) tmp;  

 表定义的比率一定不要后面是0 ,不然会得到整数的百分比

CREATE OR REPLACE TYPE RPT_XKJ_OPERATION_ROW FORCE AS OBJECT
(
     DEPT_ID                         VARCHAR2(255)                --事业部ID
    ,DEPT_NM                         VARCHAR2(255)                 --事业部名称
    ,PROJ_ID                         VARCHAR2(255)                 --项目ID
    ,PROJ_NM                         VARCHAR2(255)                 --项目名称
    ,PROJ_CD                         VARCHAR2(255)                 --项目编码
    ,CAM_TRADE_MODE                  VARCHAR2(255)                 --营销操盘方式
    ,IS_MASTER                       VARCHAR2(255)                 --是否营销主操
    ,PROJ_STAGE                      VARCHAR2(255)                 --项目阶段
    ,IS_XK                           VARCHAR2(255)                 --是否上旭客家
    ,BOOS_NUM                        NUMBER(18,0)                  --项目微楼书浏览量
    ,ACTIVITY_NUM                    NUMBER(18,0)                  --项目活动浏览量
    ,READING_NUM                     NUMBER(18,0)                  --项目浏览量(新增)
    ,NEWS_NUM                        NUMBER(18,0)                  --项目新闻浏览量
    ,REPLYDURATION                   NUMBER(18,2)                  --平均回复时长
    ,REPLYRATE                       NUMBER(18,2)                  --平均回复率
    ,REPLY_DURATION                  NUMBER(18,0)
    ,DIALOGUE_NUMBER                 NUMBER(18,0)
    ,EFFECTIVE_CONVERSATION_NUMBER   NUMBER(18,0)
    ,CONVERSATION_NUMBER             NUMBER(18,0)
    ,LBT_NUM                         NUMBER(18,0)                   --项目轮播图浏览量
    ,LSFX_NUM                        NUMBER(18,0)                   --项目楼书分享量
    ,HBFX_NUM                        NUMBER(18,0)                   --项目海报分享量
    ,HDFX_NUM                        NUMBER(18,0)                   --项目活动分享量
    ,PROJ_REMAIN_RATE_F              NUMBER(18,0)
    ,PROJ_REMAIN_RATE                NUMBER(18,2)                   --留电率(新增)
)
/

Oracle不区分空串和null

对空串和null的判断 :   

         ext.first_visit_sales_id is not null        

         AND ext.first_visit_sales_id <> '' 

改成    (不然判断不出来)

         ext.first_visit_sales_id is not null       

         AND nvl(ext.first_visit_sales_id, '#') <> '#' 

实际上只用判断  ext.first_visit_sales_id is not null        即可

在plsql中使用正常,但是bi工具查询不行的问题(临时表应该放在内层,若干条后commit导致临时表无效,报错)

  最后的T4注释掉就行了

CREATE OR REPLACE
FUNCTION FN_RPT_DYNATOWN_EFFICIENT
/****************************************************************
  函数中文名: 置业顾问效能分析表
  功能描述:   根据输入的日期区间和IDM短位项目编号,获取 置业顾问效能分析表
  编写人:     YQQ             
  编写日期:   2021-09-28
  修改记录: 
****************************************************************/
(
    I_ST_DT         VARCHAR2,
    I_END_DT        VARCHAR2,
    SRC             VARCHAR2,
    DELIMITER       VARCHAR2
)
RETURN RPT_DYNATOWN_EFFICIENT_TAB PIPELINED
AS
RSLT_TABLE RPT_DYNATOWN_EFFICIENT_ROW;
PRAGMA AUTONOMOUS_TRANSACTION;
V_START_DT DATE;
V_END_DT DATE;
BEGIN
    V_START_DT := TO_DATE(I_ST_DT, 'YYYY-MM-DD');
    V_END_DT := TO_DATE(I_END_DT, 'YYYY-MM-DD') + 1;

    INSERT INTO PARA_PROJ_LIST
    (
           IDM_PROJ_ID
           ,KD_PROJ_ID
           ,PROJ_CD
    )
    SELECT T1.IDM_PROJ_ID
           ,T1.KD_PROJ_ID
           ,T1.PROJ_CD
      FROM ODS.T02_PROJ_TREE T1
     INNER JOIN (
           SELECT B.ORGDEPID AS PORJGUID
             FROM TABLE(FN_TKT_MAP_STR(SRC, DELIMITER)) A
            INNER JOIN V_MY_IDM_PROJ_SHORT B
                  ON A.COLUMN_VALUE = B.SHORT_ORGDEPID
           ) T2
           ON T1.IDM_PROJ_ID = T2.PORJGUID
    ;

    INSERT INTO IDM_TO_JD_TEP
    SELECT B.P_PROJECTID
      FROM MV_MYS_P_PROJECT B
     INNER JOIN MV_MY_IDM_PROJ_RELA A
           ON (A.PROJGUID = B.PARENTGUID OR A.PROJGUID = B.P_PROJECTID)
     WHERE A.ORGDEPID IN (
           SELECT IDM_PROJ_ID AS PORJGUID
             FROM PARA_PROJ_LIST
           )
    ;

    FOR MYROW IN (
    SELECT  
         A.REGION_NM
        ,A.PROJ_ID          
        ,A.PROJ_NM                        --项目名
        ,A.PROJ_CD                        --项目编码
        ,A.DYNATOWN                       --置业顾问
    
        ,A.NEW_VISITOR                                                     --新访
    
        ,A.NET_ORDER_CNT                                                   --净认购套数
        ,A.REFUND_ORDER_CNT                                                --退认购套数
        ,A.DYNATOWN_DEAL_RATE              --置业顾问成交率
    
         ,G.NEW_VISITOR_P/proj_active_dynatown_count PROJ_AVG_RECEIVE_CNT          --项目新访量/激活置业顾问数目
         ,H.NET_ORDER_CNT_P /proj_active_dynatown_count PROJ_AVG_ORDER_CNT --项目人均认购套数
         ,H.NET_ORDER_CNT_P /G.NEW_VISITOR_P   PROJ_DEAL_RATE             --项目成交率
    
        ,A.CLUE_CLIENT_OUT_CNT                                             --线索客户淘出量
        ,A.VISIT_CLIENT_OUT_CNT                                            --来访客户淘出量
    FROM 
        (
            SELECT  
                 A.AreaName                         REGION_NM
                ,A.proId                            PROJ_ID          
                ,A.ProjectName                      PROJ_NM                        --项目名
                ,A.ProjectNum                       PROJ_CD                        --项目编码
                --增加金蝶项目ID
                ,A.KINDEEPROJECTID 
                ,A.EmployeeName                     DYNATOWN                       --置业顾问
        
                ,B.NEW_VISITOR                                                     --新访
        
                ,E.NET_ORDER_CNT                                                   --净认购套数
                ,F.REFUND_ORDER_CNT                                                --退认购套数
                ,E.NET_ORDER_CNT/B.NEW_VISITOR     DYNATOWN_DEAL_RATE              --置业顾问成交率
        
                -- ,G.NEW_VISITOR_P/count(A.AccountID) over(partition by A.ProjectNum) PROJ_AVG_RECEIVE_CNT          --项目新访量/激活置业顾问数目
                -- ,sum(E.NET_ORDER_CNT) over(partition by E.PROJ_ID) /count(A.AccountID) over(partition by A.ProjectNum) PROJ_AVG_ORDER_CNT --项目人均认购套数
                -- ,sum(E.NET_ORDER_CNT) over(partition by E.PROJ_ID)/G.NEW_VISITOR_P   PROJ_DEAL_RATE             --项目成交率
                
                ,count(A.AccountID) over(partition by A.ProjectNum) proj_active_dynatown_count 
                --,H.NET_ORDER_CNT_P  proj_order_count
                
                
                ,C.CLUE_CLIENT_OUT_CNT                                             --线索客户淘出量
                ,D.VISIT_CLIENT_OUT_CNT                                            --来访客户淘出量
            FROM 
            --区域 项目 置业顾问
            (select                         
                 bp.AreaName               --东南区域集团
                ,bp.HKBProjectID           --b4cd2396be3d4530bc5ca9b306e54f73    67682105730
                ,bp.ID proId               --01802085-5D65-4348-8088-550A4EFDC2EB
                ,bp.ProjectNum             --项目编码  A20170216011BJ
                ,bp.ProjectName            --项目名
                ,bp.KINDEEPROJECTID        --金蝶项目ID          uzXax8tVRU+SmRxiQ81uGLswH7D1g=
                ,com.JobName               --置业顾问                 置业顾问  写死
                ,ba.UserName               --置业顾问编码              cuifei01  yaocy
                ,ba.EmployeeName           --置业顾问名                姚春艳
                ,ba.Mobile                 --置业顾问手机号
                ,ba.Status                 --置业顾问状态:1 在职        筛选条件写死了在职
                ,ba.ID AccountID           --置业顾问账号              aa9d6408-b763-43e2-83ee-43a764f33663
            from XK_B_ACCOUNT ba           
            INNER JOIN XK_S_JOBSUSERREL rel on ba.id = rel.AccountID and IsDel = 0
            INNER JOIN XK_S_JOBS jobs on rel.JobID = jobs.ID and jobs.isIdm = 0
            INNER JOIN XK_S_COMMONJOBS com on jobs.CommonJobID = com.ID and com.isIdm = 0
            INNER JOIN XK_S_ORGANIZATION org on org.id = jobs.JobOrgID and org.IsDel = 0
            INNER JOIN XK_B_PROJECT bp on bp.ID = org.ProjectID and bp.IsDel = 0
        
            INNER JOIN PARA_PROJ_LIST T4
                ON bp.ProjectNum=T4.PROJ_CD  --  A码
        
            where com.JobCode = 'zygw' and ba.isIdm=0 and ba.Status = 1
            ORDER BY bp.ID) A
            left join 
            --新访
            (SELECT
                 ext.first_visit_sales_id           --0ee88850-7291-44ec-b05c-6c4957bebe6e
                ,opp.PROJECTID
                ,count(1) NEW_VISITOR
            FROM XK_B_CLUE_OPPORTUNITY_EXTEND ext
            INNER JOIN XK_B_PROJECT_OPPORTUNITY opp 
                  on opp.ProjectClueId = ext.ProjectClueId
            WHERE
                ext.first_visit_sales_id IS NOT NULL 
                --AND ext.first_visit_sales_id <> '' 
                --and opp.PROJECTID = '15A3740D-BBC4-E811-80BB-005056A21B76'
                --and opp.TheFirstVisitDate BETWEEN '2020-08-20' and '2021-08-20'
                and opp.TheFirstVisitDate BETWEEN V_START_DT and V_END_DT
            GROUP BY
                ext.first_visit_sales_id
               ,opp.PROJECTID
            )B ON A.AccountID=B.first_visit_sales_id and B.PROJECTID=A.proId    --职业顾问可能在多个项目工作
            LEFT JOIN(
            --线索客户池淘出量
            select 
               count(1) CLUE_CLIENT_OUT_CNT
		      ,project_id
              ,operator                           -- ab4afb67-8c3f-45dd-be6f-d3adb3bd3a4d  000106119
            from xk_b_public_pool_his 
            where clue_status = 1 and record_type = 5 
            --and project_id = '71F31DB2-80AB-EA11-80BE-005056A21B76'
            and record_time BETWEEN V_START_DT and V_END_DT
            GROUP BY operator
			        ,project_id
            ) C ON A.AccountID=C.operator and  C.project_id=A.proId
            LEFT JOIN 
            (
            --来访客户池淘出量
            select 
                count(1) VISIT_CLIENT_OUT_CNT
			   ,project_id
               ,operator  
            from xk_b_public_pool_his 
            where clue_status > 1 and record_type = 5 
            --and project_id = 'D147AF9D-54D5-E911-80BE-005056A21B76'
            and record_time BETWEEN V_START_DT and V_END_DT
            GROUP BY operator
			        ,project_id
            ) D ON A.AccountID=D.operator  and  D.project_id=A.proId
            LEFT JOIN
            (
            --净认购套数
            --查询时间段内项目上置业顾问的净认购套数(不含车位、储藏室)
            select 
                 PROJ_ID                   --项目编号          U4fopiJnQUC2dLuEF7yTxAH7D1g=
                ,PROP_CNST_ID              --置业顾问ID        zhouxj  xs-luopeng  wangjue   yf-xingshan zhaodd01
                ,sum(ORDER_CNT) NET_ORDER_CNT  --认购套数  sum
            from ods.T05_ORDER_DTL
            WHERE PROD_NM NOT LIKE '%车%' 
             and ORDER_DTTM >= V_START_DT
             AND ORDER_DTTM <  V_END_DT
             GROUP BY 
                 PROJ_ID
                ,PROP_CNST_ID              --置业顾问ID
            ) E ON A.UserName=E.PROP_CNST_ID  and  e.PROJ_ID=A.KINDEEPROJECTID
            LEFT JOIN
            (
            --退认购套数
            --查询时间段内(退房日期)的认购退房套数(不含车位、储藏室)
            select 
                 PROJ_ID
                ,PROP_CNST_ID       --置业顾问ID
                ,SUM(ORDER_CNT) REFUND_ORDER_CNT         --按负数
            from ods.T05_ORDER_DTL
            WHERE PROD_NM NOT LIKE '%车%' 
              and ORDER_DTTM >= V_START_DT
              AND ORDER_DTTM <  V_END_DT
              and ORDER_CNT<0      -- ORDER_TYPE         --退房(此时ORDER_CNT=-1) 
            GROUP BY 
                 PROJ_ID
                ,PROP_CNST_ID              --置业顾问ID
            ) F ON A.UserName=F.PROP_CNST_ID and  F.PROJ_ID=A.KINDEEPROJECTID
        ) A
        
        left join                           --项目维度
        (
            SELECT
                 count(1) NEW_VISITOR_P
                ,opp.PROJECTID           --6B73B4F7-E3CF-EA11-80BE-005056A21B76
            FROM XK_B_CLUE_OPPORTUNITY_EXTEND ext
            INNER JOIN XK_B_PROJECT_OPPORTUNITY opp 
            on opp.ProjectClueId = ext.ProjectClueId
            WHERE
                opp.PROJECTID IS NOT NULL 
                --AND ext.first_visit_sales_id <> '' 
                --and opp.PROJECTID = '15A3740D-BBC4-E811-80BB-005056A21B76'
                --and opp.TheFirstVisitDate BETWEEN '2020-08-20' and '2021-08-20'
                and opp.TheFirstVisitDate BETWEEN V_START_DT and V_END_DT
            GROUP BY
                opp.PROJECTID
        ) G  ON G.PROJECTID=A.PROJ_ID

        left join                           --项目维度   项目认购套数
        (
              select 
                 PROJ_ID                   --项目编号          U4fopiJnQUC2dLuEF7yTxAH7D1g=
                ,sum(ORDER_CNT) NET_ORDER_CNT_P  --认购套数  sum
            from ods.T05_ORDER_DTL
            WHERE PROD_NM NOT LIKE '%车%' 
             and ORDER_DTTM >= V_START_DT
             AND ORDER_DTTM <  V_END_DT
             GROUP BY 
                 PROJ_ID

        ) H  ON H.PROJ_ID=A.KINDEEPROJECTID
        -- INNER JOIN PARA_PROJ_LIST T4
        --            ON A.PROJ_CD=T4.PROJ_CD  --  A码
     )
    LOOP
    RSLT_TABLE := RPT_DYNATOWN_EFFICIENT_ROW (
        -- MYROW.REGION_ID 
         MYROW.REGION_NM            
        ,MYROW.PROJ_ID              
        ,MYROW.PROJ_NM              
        ,MYROW.PROJ_CD              
        ,MYROW.DYNATOWN             
        ,MYROW.NEW_VISITOR          
        ,MYROW.NET_ORDER_CNT        
        ,MYROW.REFUND_ORDER_CNT     
        ,MYROW.DYNATOWN_DEAL_RATE   
        ,MYROW.PROJ_AVG_RECEIVE_CNT 
        ,MYROW.PROJ_AVG_ORDER_CNT   
        ,MYROW.PROJ_DEAL_RATE       
        ,MYROW.CLUE_CLIENT_OUT_CNT  
        ,MYROW.VISIT_CLIENT_OUT_CNT 
  )
    ;
    COMMIT;
    PIPE ROW(RSLT_TABLE);
    END LOOP;

    COMMIT;
    RETURN;
END
;

Oracle没bigint这个,可以用number(18,0)

字符类型时间和date类型转换

        select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') 

Guess you like

Origin blog.csdn.net/someInNeed/article/details/120502755