2016-12-22 5 views
0

oracle에는 작업 지시 합격률을 반환하는 코드가 있습니다. 기본적으로 실패 횟수 (MRB)를 취하고 처리율을 제공하기 위해 처리 된 작업 주문 수 (WO)로 나눕니다. 내가 가진 문제는 실패 (MRB)가 없으면 해당 달에 대한 수익을 얻을 수 없다는 것입니다. MRB에 장애가 발생하지 않은 경우 그 달에 100 %의 수익을 원합니다. 여기에 내가 작업하고있는 코드가있다. 기록을 위해, 나는 프로그래머가 아니다, 나는 방금 길을 따라 약간의 정보를 집어 들었다. NVL 추가를 시도했지만 도움이되지 않습니다.null 일 경우 값을 반환하십시오.

Select To_Char(MTH, 'Month') As "Month",WO, MRB, 
    Round(1 - (MRB/WO), 3) *  100 As "Pass Rate", 
    '98' As Goal 
From 
(
     Select Trunc(g.START_DATE, 'Month') As mth, 
       Count(Distinct V_PDAYPROD_CRW1.PDAYPROD_ID) As WO, 
       Count(Distinct V_WF_HEADER_MRB.ID) As MRB 
     From GLPERIODS g 
     Left Join V_PDAYPROD_CRW1 On Trunc(g.START_DATE, 'Month') = Trunc(V_PDAYPROD_CRW1.PROD_DATE, 'Month') 
     Left Join V_WF_HEADER_MRB On Trunc(g.START_DATE, 'Month') = Trunc(V_WF_HEADER_MRB.OPEN_DATE, 'Month') 
     Inner Join ARINVT On V_PDAYPROD_CRW1.ARINVT_ID = ARINVT.ID 
     Where Extract(Year From g.START_DATE) = Extract(Year From SysDate) 
      And V_WF_HEADER_MRB.WF_TYPE_ID = '99' 
      And V_WF_HEADER_MRB.EPLANT_ID = 2 
      And ARINVT.EPLANT_ID = 2 
     Group By Trunc(g.START_DATE, 'Month'), 
      V_WF_HEADER_MRB.WF_TYPE_ID 
) 
Group By To_Char(MTH, 'Month'),WO,MRB, 
    Round(1 - (MRB/WO), 3) * 100, 
    '98',MTH 
Order By MTH 

위의 코드는 다음을 반환

MONTH  | WO | MRB | Pass Rate | GOAL 
    September | 60 | 1 | 98.3  | 98 
    December | 30 | 2 | 93.3  | 98 

나는 이런 식으로 뭔가를 반환하는 데 싶습니다

MONTH  | WO | MRB | Pass Rate | GOAL 
    January | 25 | 0 | 100  | 98 
    February | 66 | 0 | 100  | 98 
    March  | 35 | 0 | 100  | 98 
    April  | 22 | 0 | 100  | 98 
    May  | 19 | 0 | 100  | 98 
    June  | 47 | 0 | 100  | 98 
    July  | 52 | 0 | 100  | 98 
    August | 55 | 0 | 100  | 98 
    September | 60 | 1 | 98.3  | 98 
    October | 39 | 0 | 100  | 98 
    November | 18 | 0 | 100  | 98 
    December | 30 | 2 | 93.3  | 98 

당신이 제공 할 수있는 모든 도움을 주셔서 감사합니다.

답변

-1

당신은 기본 테이블의 모든 레코드는 다음 WHERE 절에 "v_wf_header_mrb"테이블에 필터링 기준을 사용하지 말아야 결과 집합에 반환 될 것으로 예상합니다. 조건 Where 절 시도에서

제거 " .WF_TYPE_ID = '99'과 V_WF_HEADER_MRB .EPLANT_ID = 2 V_WF_HEADER_MRB".

다음 쿼리를 대신 사용할 수 있습니다.

SELECT 
    TO_CHAR(mth,'Month') AS "Month", 
    wo, 
    mrb, 
    round(1 - (mrb/wo),3) * 100 AS "Pass Rate", 
    '98' AS goal 
FROM 
    (
     SELECT 
      trunc(g.start_date,'Month') AS mth, 
      COUNT(DISTINCT v_pdayprod_crw1.pdayprod_id) AS wo, 
      COUNT(DISTINCT v_wf_header_mrb.id) AS mrb 
     FROM 
      glperiods g 
     LEFT JOIN 
      v_pdayprod_crw1 
     ON 
      trunc(g.start_date,'Month') = trunc(v_pdayprod_crw1.prod_date,'Month') 
     LEFT JOIN 
      v_wf_header_mrb 
     ON 
      trunc(g.start_date,'Month') = trunc(v_wf_header_mrb.open_date,'Month') 
     AND 
      v_wf_header_mrb.wf_type_id = '99' 
     AND 
      v_wf_header_mrb.eplant_id = 2 
      INNER JOIN 
       arinvt 
      ON 
       v_pdayprod_crw1.arinvt_id = arinvt.id 
     WHERE 
      EXTRACT(YEAR FROM g.start_date) = EXTRACT(YEAR FROM SYSDATE) 
     AND 
      arinvt.eplant_id = 2 
     GROUP BY 
      trunc(g.start_date,'Month'), 
      v_wf_header_mrb.wf_type_id 
    ) 
GROUP BY 
    TO_CHAR(mth,'Month'), 
    wo, 
    mrb, 
    round(1 - (mrb/wo),3) * 100, 
    '98', 
    mth 
ORDER BY mth; 
+0

필터를 유지해야합니다. 99는 MRB의 유형을 나타내고 2의 eplant는 내가 찾고있는 회사 데이터를 나타냅니다 (우리는 데이터베이스 내에 2 개의 회사가 있습니다). –

+0

표시, "조인 조건"과 동일한 필터를 사용하십시오. 이미 조인 조건에 해당 필터가 포함되어 있습니다. 위의 대답에서 쿼리를 실행하고 결과를 확인하십시오. – Manjunatha

+0

그랬어! 정말 고맙습니다!!! –