根据 Oracle 中的百分比明智计算更新多个列
Update multiple columns based on percentage wise calculation in Oracle
注意:使用示例数据和输出更新总问题。
我需要通过与另一个 table 比较来更新一些列,并按百分比更新列。那我走了。
首先,获取 CMM 批准的长度 的查询在下方,其中包含我需要的其他列
select CIRCLE,regexp_substr(MP,'[^/]+',1,1)MPNAME,regexp_substr(MP,'[^/]+',1,2)MPCODE,
SPAN_TYPE,SPAN_LINK_ID,NE_LENGTH AS NE_LEN,
ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH from
TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL OR ROUTE_APPROVED_BY_CMM > 0 OR
JOB_PROGRESS_FLAG = 1;
上述查询的输出如下图所示
[![在此处输入图片描述][1]][1]
现在是第二部分,计算百分比
案例 1:如果上图中的 CMM 批准长度为 70km,NE 长度(NE,UG,AR len from NE.MV_SPAN@DB_LINK_NE_VIEWER
)得出 100Km 则除以 (UG=80Km and AR=20Km)
那么分叉的百分比将是 80% UG_length 和 20% AR_length。因此,针对 CMM 批准的 70 公里公里,TBL_FIBER_INV_SIGN_OFF_SHEET
应将列更新为 UG = 56Km
和 AR = 14Km
。
分叉应该在下面更新 table TBL_FIBER_INV_SIGN_OFF_SHEET
和 table 示例数据如下所示:-
[![在此处输入图片描述][2]][2]
案例 2:如果 CMM approved length
和 NE length
相同。例如:70km(UG = 60 Km 和 AR=10Km)然后在 TBL_FIBER_INV_SIGN_OFF_SHEET
table 应该更新 UG = 60Km and AR = 10Km
.
下面是 table 对 table 的描述。
CREATE OR REPLACE PROCEDURE UPD_UG_AR_BY_CMM AS
BEGIN
for cur_r in (
select circle,
regexp_substr(MP,'[^/]+',1,1)MAINTENANCE_ZONE_NAME,
regexp_substr(MP,'[^/]+',1,2)MAINTENANCE_ZONE_CODE,
SPAN_TYPE,
SPAN_LINK_ID,
NE_LENGTH,
ROUTE_APPROVED_BY_CMM
from TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL
OR ROUTE_APPROVED_BY_CMM > 0
OR JOB_PROGRESS_FLAG = 1
)
LOOP
IF cur_r.ROUTE_APPROVED_BY_CMM > SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
THEN
BEGIN
UPDATE TBL_FIBER_INV_SIGN_OFF_SHEET
SET FSA_UG = UG_LENGTH, --- divide 80% of NE_LENGTH
FSA_AERIAL = AR_LENGTH --- divide 20% of NE_LENGTH
WHERE CUR_R.SPAN_LINK_ID = RJ_SPAN_ID
END
NULL;
END UPD_UG_AR_BY_CMM;
但我一直卡在百分比计算上。
好的,经过大量的澄清,最终看起来应该是:
+更新:重复
merge into TBL_FIBER_INV_SIGN_OFF_SHEET DST
using (
-- Source: original query
with mv as (
select * from (
select
circle,
regexp_substr(MP,'[^/]+',1,1)MAINTENANCE_ZONE_NAME,
regexp_substr(MP,'[^/]+',1,2)MAINTENANCE_ZONE_CODE,
SPAN_TYPE,
SPAN_LINK_ID,
NE_LENGTH, -- ? NE_LENGTH - 1
ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH,
row_number()over(partition by SPAN_LINK_ID order by ROUTE_APPROVED_BY_CMM) rn
from TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL
OR ROUTE_APPROVED_BY_CMM > 0
OR JOB_PROGRESS_FLAG = 1
)
where rn=1
)
,pct as (
SELECT
ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH -- ? NE_LENGTH - 2
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%'
OR RJ_CONSTRUCTION_METHODOLOGY IS NULL
THEN NVL(CALCULATED_LENGTH,0)
ELSE 0
END)/1000,4
) AS UG_LENGTH
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%'
THEN NVL(CALCULATED_LENGTH,0)
ELSE 0
END)/1000,4
) AS AR_LENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
)
select
mv.*
--,cpt.*
,case when mv.CMM_APPROVED_LENGTH > pct.NE_LENGTH then 0.8 * pct.UG_length
when mv.CMM_APPROVED_LENGTH = pct.NE_LENGTH then 0.9 * pct.UG_length
end as FSA_UG
,case when mv.CMM_APPROVED_LENGTH > pct.NE_LENGTH then 0.2 * pct.AR_LENGTH
when mv.CMM_APPROVED_LENGTH = pct.NE_LENGTH then 0.1 * pct.AR_LENGTH
end as FSA_AERIAL
from mv, pct
-- end of Source query
) SRC
on ( dst.SPAN_LINK_ID = src.SPAN_LINK_ID )
when matched then update
set FSA_UG = src.FSA_UG
,FSA_AERIAL = src.FSA_AERIAL;
根据您的问题解释,更新应该是
update TBL_FIBER_INV_CMP_REPORT_MV
set UG = CASE WHEN ROUTE_APPROVED_BY_CMM > 70 AND NE_LENGTH >= 100
THEN NE_LENGTH*0.8
WHEN ROUTE_APPROVED_BY_CMM = NE_LENGTH
THEN NE_LENGTH*(60/70)
ELSE 0 END
, AR = CASE WHEN ROUTE_APPROVED_BY_CMM > 70 AND NE_LENGTH >= 100
THEN NE_LENGTH*0.2
WHEN ROUTE_APPROVED_BY_CMM = NE_LENGTH
THEN NE_LENGTH*(60/10)
ELSE 0 END
注意:使用示例数据和输出更新总问题。
我需要通过与另一个 table 比较来更新一些列,并按百分比更新列。那我走了。
首先,获取 CMM 批准的长度 的查询在下方,其中包含我需要的其他列
select CIRCLE,regexp_substr(MP,'[^/]+',1,1)MPNAME,regexp_substr(MP,'[^/]+',1,2)MPCODE,
SPAN_TYPE,SPAN_LINK_ID,NE_LENGTH AS NE_LEN,
ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH from
TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL OR ROUTE_APPROVED_BY_CMM > 0 OR
JOB_PROGRESS_FLAG = 1;
上述查询的输出如下图所示
[![在此处输入图片描述][1]][1]
现在是第二部分,计算百分比
案例 1:如果上图中的 CMM 批准长度为 70km,NE 长度(NE,UG,AR len from NE.MV_SPAN@DB_LINK_NE_VIEWER
)得出 100Km 则除以 (UG=80Km and AR=20Km)
那么分叉的百分比将是 80% UG_length 和 20% AR_length。因此,针对 CMM 批准的 70 公里公里,TBL_FIBER_INV_SIGN_OFF_SHEET
应将列更新为 UG = 56Km
和 AR = 14Km
。
分叉应该在下面更新 table TBL_FIBER_INV_SIGN_OFF_SHEET
和 table 示例数据如下所示:-
[![在此处输入图片描述][2]][2]
案例 2:如果 CMM approved length
和 NE length
相同。例如:70km(UG = 60 Km 和 AR=10Km)然后在 TBL_FIBER_INV_SIGN_OFF_SHEET
table 应该更新 UG = 60Km and AR = 10Km
.
下面是 table 对 table 的描述。
CREATE OR REPLACE PROCEDURE UPD_UG_AR_BY_CMM AS
BEGIN
for cur_r in (
select circle,
regexp_substr(MP,'[^/]+',1,1)MAINTENANCE_ZONE_NAME,
regexp_substr(MP,'[^/]+',1,2)MAINTENANCE_ZONE_CODE,
SPAN_TYPE,
SPAN_LINK_ID,
NE_LENGTH,
ROUTE_APPROVED_BY_CMM
from TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL
OR ROUTE_APPROVED_BY_CMM > 0
OR JOB_PROGRESS_FLAG = 1
)
LOOP
IF cur_r.ROUTE_APPROVED_BY_CMM > SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH,
ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS NULL THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
THEN
BEGIN
UPDATE TBL_FIBER_INV_SIGN_OFF_SHEET
SET FSA_UG = UG_LENGTH, --- divide 80% of NE_LENGTH
FSA_AERIAL = AR_LENGTH --- divide 20% of NE_LENGTH
WHERE CUR_R.SPAN_LINK_ID = RJ_SPAN_ID
END
NULL;
END UPD_UG_AR_BY_CMM;
但我一直卡在百分比计算上。
好的,经过大量的澄清,最终看起来应该是:
+更新:重复
merge into TBL_FIBER_INV_SIGN_OFF_SHEET DST
using (
-- Source: original query
with mv as (
select * from (
select
circle,
regexp_substr(MP,'[^/]+',1,1)MAINTENANCE_ZONE_NAME,
regexp_substr(MP,'[^/]+',1,2)MAINTENANCE_ZONE_CODE,
SPAN_TYPE,
SPAN_LINK_ID,
NE_LENGTH, -- ? NE_LENGTH - 1
ROUTE_APPROVED_BY_CMM as CMM_APPROVED_LENGTH,
row_number()over(partition by SPAN_LINK_ID order by ROUTE_APPROVED_BY_CMM) rn
from TBL_FIBER_INV_CMP_REPORT_MV
where CMM_APPROVED_DATE IS NOT NULL
OR ROUTE_APPROVED_BY_CMM > 0
OR JOB_PROGRESS_FLAG = 1
)
where rn=1
)
,pct as (
SELECT
ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH -- ? NE_LENGTH - 2
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%'
OR RJ_CONSTRUCTION_METHODOLOGY IS NULL
THEN NVL(CALCULATED_LENGTH,0)
ELSE 0
END)/1000,4
) AS UG_LENGTH
,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%'
THEN NVL(CALCULATED_LENGTH,0)
ELSE 0
END)/1000,4
) AS AR_LENGTH
FROM NE.MV_SPAN@DB_LINK_NE_VIEWER
)
select
mv.*
--,cpt.*
,case when mv.CMM_APPROVED_LENGTH > pct.NE_LENGTH then 0.8 * pct.UG_length
when mv.CMM_APPROVED_LENGTH = pct.NE_LENGTH then 0.9 * pct.UG_length
end as FSA_UG
,case when mv.CMM_APPROVED_LENGTH > pct.NE_LENGTH then 0.2 * pct.AR_LENGTH
when mv.CMM_APPROVED_LENGTH = pct.NE_LENGTH then 0.1 * pct.AR_LENGTH
end as FSA_AERIAL
from mv, pct
-- end of Source query
) SRC
on ( dst.SPAN_LINK_ID = src.SPAN_LINK_ID )
when matched then update
set FSA_UG = src.FSA_UG
,FSA_AERIAL = src.FSA_AERIAL;
根据您的问题解释,更新应该是
update TBL_FIBER_INV_CMP_REPORT_MV
set UG = CASE WHEN ROUTE_APPROVED_BY_CMM > 70 AND NE_LENGTH >= 100
THEN NE_LENGTH*0.8
WHEN ROUTE_APPROVED_BY_CMM = NE_LENGTH
THEN NE_LENGTH*(60/70)
ELSE 0 END
, AR = CASE WHEN ROUTE_APPROVED_BY_CMM > 70 AND NE_LENGTH >= 100
THEN NE_LENGTH*0.2
WHEN ROUTE_APPROVED_BY_CMM = NE_LENGTH
THEN NE_LENGTH*(60/10)
ELSE 0 END