处理分母为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')