Обновить несколько столбцов на основе процентного расчета в Oracle - PullRequest
1 голос
/ 09 июля 2020

ПРИМЕЧАНИЕ. Обновление общего вопроса с образцами данных и вывода.

Мне нужно обновить некоторые столбцы, сравнив их из другой таблицы, и обновить столбцы в процентном отношении. Итак, здесь я go.

, прежде всего, запрос на получение утвержденной длины 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: Если утвержденная длина КИМ на изображении выше составляет 70 км, а длина NE от (NE, UG, AR len от NE.MV_SPAN@DB_LINK_NE_VIEWER) оказывается равной 100 км, тогда разделите (UG=80Km and AR=20Km)

Тогда процент бифуркации будет 80% UG_length и 20% AR_length . Таким образом, вместо 70 км утвержденного километра CMM, TBL_FIBER_INV_SIGN_OFF_SHEET должно обновить столбец как UG = 56Km и AR = 14Km. бифуркация должна быть обновлена ​​в таблице ниже TBL_FIBER_INV_SIGN_OFF_SHEET

, а данные образца таблицы выглядят следующим образом: -

[! [введите здесь описание изображения] [2]] [2]

ВАРИАНТ 2: ЕСЛИ CMM approved length и NE length одинаковы. например: 70 км (UG = 60 км и AR = 10 км), тогда в таблице TBL_FIBER_INV_SIGN_OFF_SHEET должно быть обновлено значение UG = 60Km and AR = 10Km.

Ниже приведено описание обеих таблиц.

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;

, но я застрял в вычислении процентного соотношения.

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Основываясь на объяснении вашего вопроса, обновление должно быть

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
1 голос
/ 12 июля 2020

хорошо, так что, наконец, после тонны разъяснений, похоже, что должно быть:

+ update: duplicates

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...