在Oracle中基于百分比计算更新多列

在Oracle中基于百分比计算更新多列,oracle,stored-procedures,Oracle,Stored Procedures,注:使用样本数据和输出更新总问题 我需要通过比较另一个表来更新一些列,并按百分比更新这些列。我来了 首先,下面是获得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_L

注:使用样本数据和输出更新总问题

我需要通过比较另一个表来更新一些列,并按百分比更新这些列。我来了

首先,下面是获得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距离NE.MV_SPAN@DB_LINK_NE_VIEWERcomes算出100公里,然后将UG=80公里和AR=20公里分开

然后分叉的百分比将是80%UG_长度和20%AR_长度。因此,根据CMM批准的70公里里程,TBL\u FIBER\u INV\u SIGN\u OFF\u SHEET应将该列更新为UG=56公里和AR=14公里。 应在下表TBL_FIBER_INV_SIGN_OFF_表中更新分叉

表中的示例数据如下所示:-

[![在此处输入图像描述][2][2]

情况2:如果CMM批准的长度和NE长度相同。对于ex:70km UG=60Km和AR=10Km,则在TBL\u FIBER\u INV\u SIGN\u OFF\u表中应更新UG=60Km和AR=10Km

以下是两个表的表说明

创建或替换程序UPD\U UG\U AR\U由\U CMM作为 开始 目前 选择圆, regexp_substrMP,“[^/]+”,1,1维护区域名称, regexp_substrMP,“[^/]+”,1,2维护区代码, SPAN_型, SPAN_LINK_ID, NE_长度, 路线由CMM批准 来自TBL_光纤_库存_CMP_报告_MV 其中,CMM\u批准的\u日期不为空 或路线经\u CMM批准\u>0 或作业进度标志=1 环 如果当前路线由CMM批准,则选择圆形计算长度,0/1000,4作为NE长度, RoundSum当RJ_构造_方法(与“%Aeror%”或RJ_构造_方法不同)为空时,则为NVLCALCULATED_LENGTH,0否则0结束/1000,4作为UG_LENGTH ,当RJ_构造_方法(如“%天线%”)然后计算_长度,否则0结束/1000,4作为AR_长度 来自NE.MV_SPAN@DB_LINK_NE_VIEWER 然后 开始 更新TBL\U光纤库存签核表 设置FSA_UG=UG_长度,-除以NE_长度的80% FSA_天线=AR_长度-除以NE_长度的20% 其中CUR_R.SPAN_LINK_ID=RJ_SPAN_ID 终止 无效的
用三坐标测量机完成测量 好的,经过大量的澄清,最后看起来应该是:

+更新:重复

合并到TBL_光纤库存签字表DST中 使用 -来源:原始查询 以mv为例 从中选择* 选择 圆圈 regexp_substrMP,“[^/]+”,1,1维护区域名称, regexp_substrMP,“[^/]+”,1,2维护区代码, SPAN_型, SPAN_LINK_ID, 你的长度是多少?NE_长度-1 由CMM批准的路线作为CMM批准的长度, 行号按跨度划分链接ID按路线排序CMM rn批准 来自TBL_光纤_库存_CMP_报告_MV 其中,CMM\u批准的\u日期不为空 或路线经\u CMM批准\u>0 或作业进度标志=1 其中rn=1 ,pct-as 选择 圆形长度计算长度,0/1000,4为NE长度-?NE_长度-2 ,当RJ_构造_方法与“%Aerotic%”不同时的情况 或者RJ_构造_方法为空 然后NVLCALCULATED_长度,0 其他0 完二〇〇〇年四月十日(星期四) 如UG_长度 ,当RJ_构造_方法(如“%AERIAL%”)时的情况 然后NVLCALCULATED_长度,0 其他0 完二〇〇〇年四月十日(星期四) 如AR_长度 来自NE.MV_SPAN@DB_LINK_NE_VIEWER 选择 mv* -,cpt* 当mv.CMM\U批准的长度>pct.NE\U长度时,则为0.8*pct.UG\U长度 当mv.CMM\U批准的长度=pct.NE\U长度时,则为0.9*pct.UG\U长度 以FSA_UG结尾 当mv.CMM\U批准的长度>pct.NE\U长度,然后是0.2*pct.AR\U长度时的情况 当mv.CMM\U批准的长度=pct.NE\U长度时,则为0.1*pct.AR\U长度 作为FSA_天线结束 来自mv,pct -源查询结束 SRC 在dst.SPAN_LINK_ID=src.SPAN_LINK_ID上 匹配后再更新 设置FSA_UG=src.FSA_UG ,FSA_天线=src.FSA_天线;
好的,经过无数次的澄清之后,看起来是这样的 应该是:

+更新:重复

合并到TBL_光纤库存签字表DST中 使用 -来源:原始查询 以mv为例 从中选择* 选择 圆圈 regexp_substrMP,“[^/]+”,1,1维护区域名称, regexp_substrMP,“[^/]+”,1,2维护区代码, SPAN_型, SPAN_LINK_ID, 你的长度是多少?NE_长度-1 由CMM批准的路线作为CMM批准的长度, 行号按跨度划分链接ID按路线排序CMM rn批准 来自TBL_光纤_库存_CMP_报告_MV 其中,CMM\u批准的\u日期不为空 或路线经\u CMM批准\u>0 或作业进度标志=1 其中rn=1 ,pct-as 选择 圆形长度计算长度,0/1000,4为NE长度-?NE_长度-2 ,当RJ_构造_方法与“%Aerotic%”不同时的情况 或者RJ_构造_方法为空 然后NVLCALCULATED_长度,0 其他0 完二〇〇〇年四月十日(星期四) 如UG_长度 ,当RJ_构造_方法(如“%AERIAL%”)时的情况 然后NVLCALCULATED_长度,0 其他0 完二〇〇〇年四月十日(星期四) 如AR_长度 来自NE.MV_SPAN@DB_LINK_NE_VIEWER 选择 mv* -,cpt* 当mv.CMM\U批准的长度>pct.NE\U长度时,则为0.8*pct.UG\U长度 当mv.CMM\U批准的长度=pct.NE\U长度时,则为0.9*pct.UG\U长度 以FSA_UG结尾 当mv.CMM\U批准的长度>pct.NE\U长度,然后是0.2*pct.AR\U长度时的情况 当mv.CMM\U批准的长度=pct.NE\U长度时,则为0.1*pct.AR\U长度 作为FSA_天线结束 来自mv,pct -源查询结束 SRC 在dst.SPAN_LINK_ID=src.SPAN_LINK_ID上 匹配后再更新 设置FSA_UG=src.FSA_UG ,FSA_天线=src.FSA_天线;
根据您的问题解释,更新应该是

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

根据您的问题解释,更新应该是

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

示例数据和期望的结果将非常有用。您从NE.MV中编写了NE、UG和AR len_SPAN@DB_LINK_NE_VIEWER,但我在其“描述”中没有看到这样的专栏。请从定义中删除不必要的列,并描述或标记所需的列,请描述视图/表及其键之间的关系。此外,使用table.column作为变量查看计算公式的元描述也会容易得多。不应该通过RJ\U SPAN\U ID从MV\U SPAN contain group查询吗?RJ_SPAN_ID是TBL_FIBER_INV_CMP_REPORT_MV和TBL_FIBER_INV_SIGN_OFF_SHEET的连接键吗?样本数据和所需结果将非常有用。您在NE.MV中编写了NE、UG和AR len_SPAN@DB_LINK_NE_VIEWER,但我在其“描述”中没有看到这样的专栏。请从定义中删除不必要的列,并描述或标记所需的列,请描述视图/表及其键之间的关系。此外,使用table.column作为变量查看计算公式的元描述也会容易得多。不应该通过RJ\U SPAN\U ID从MV\U SPAN contain group查询吗?RJ\U SPAN\U ID是否是TBL\U光纤库存CMP\U报告和TBL\U光纤库存签核表的连接键?检查pct中的查询-是否正确?我是从你的问题检查第二个问题中得到的。如果需要,你可以在主选项pct中添加其他列。UG_length/pct.UG_length+pct.AR_length是一个百分比:简单的公式a/a+B,那么在80和20的情况下,它将是80%:80/80+20是80%&20%静态百分比?不是动态的?检查pct中的查询-它真的正确吗?我是从你的问题检查第二个问题中得到的。如果需要,你可以在主选项pct中添加其他列。UG_length/pct.UG_length+pct.AR_length是一个百分比:简单的公式a/a+B,那么在80和20的情况下,它将是80%:80/80+20是80%&20%静态百分比?不是动态的?