在Oracle中基于百分比计算更新多列
注:使用样本数据和输出更新总问题 我需要通过比较另一个表来更新一些列,并按百分比更新这些列。我来了 首先,下面是获得CMM批准长度的查询以及我需要的其他列在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
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%静态百分比?不是动态的?