Oracle 如果为null,则返回一个值

Oracle 如果为null,则返回一个值,oracle,null,zero,Oracle,Null,Zero,在oracle中,我有一段代码返回我们的工单通过率。它本质上是以MRB的故障数除以WO处理的工单数来给出速率。我的问题是,除非有一个失败的MRB,我不会得到相应月份的回报。如果没有MRB故障,我希望当月100%的回报。这是我正在使用的代码。作为记录,我不是一名程序员,我只是在这一过程中获得了一些信息。我已经尝试添加NVL,但似乎没有帮助 Select To_Char(MTH, 'Month') As "Month",WO, MRB, Round(1 - (MRB / WO), 3) *

在oracle中,我有一段代码返回我们的工单通过率。它本质上是以MRB的故障数除以WO处理的工单数来给出速率。我的问题是,除非有一个失败的MRB,我不会得到相应月份的回报。如果没有MRB故障,我希望当月100%的回报。这是我正在使用的代码。作为记录,我不是一名程序员,我只是在这一过程中获得了一些信息。我已经尝试添加NVL,但似乎没有帮助

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

感谢您提供的任何帮助。

如果希望主表中的所有记录都返回到结果集中,则不应在where子句中使用v_wf_header_mrb表上的筛选条件

从Where子句中删除V_WF_HEADER_MRB.WF_TYPE_ID='99'和V_WF_HEADER_MRB.EPLANT_ID=2条件,然后重试

您可以改为使用下面的查询

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;

我需要保留过滤器。99表示MRB的类型,2的eplant表示我正在查找的公司数据。数据库中有两个公司。请标记,在连接条件中使用相同的筛选器。我已经在连接条件中包含了这些过滤器。执行上面答案中的查询并检查结果。一旦我弄明白了怎么做,我会立即回答!非常感谢。