Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL处理因被零除而导致的错误_Sql_Null_Coalesce_Divide By Zero_Nullif - Fatal编程技术网

使用SQL处理因被零除而导致的错误

使用SQL处理因被零除而导致的错误,sql,null,coalesce,divide-by-zero,nullif,Sql,Null,Coalesce,Divide By Zero,Nullif,数据库引擎是一个叫做Paprika的金融软件。其目的是在2018年12月为某一特定部门提取收入 (2018年12月3个数据库(英国、美国、巴西)的项目价值工作概率/汇率)(部门工时基于等级/数据库总工时) 零值来自最后一部分(最后3分)——在为每个项目逐级提取小时数时,其中许多项目的小时数为零 以下是帮助台的评论: “对视图进行编码的人可以在计算中添加IF语句,让辣椒粉知道在遇到被零除的情况下该怎么办,这将阻止视图崩溃。” 出现错误的代码: (((COALESCE((SELECT SUM(JF_

数据库引擎是一个叫做Paprika的金融软件。其目的是在2018年12月为某一特定部门提取收入

(2018年12月3个数据库(英国、美国、巴西)的项目价值工作概率/汇率)(部门工时基于等级/数据库总工时)

零值来自最后一部分(最后3分)——在为每个项目逐级提取小时数时,其中许多项目的小时数为零

以下是帮助台的评论:
“对视图进行编码的人可以在计算中添加IF语句,让辣椒粉知道在遇到被零除的情况下该怎么办,这将阻止视图崩溃。”

出现错误的代码:

(((COALESCE((SELECT SUM(JF_AMOUNT) 
             FROM MAV.UK.JOB_BUD_FORECAST, MAV.UK.NOMINAL_PERIOD 
             WHERE JF_JO_MN=JO_MN AND JF_FORECAST_TYPE=1 AND JF_NP_MN=NP_MN AND NP_PERIOD_KEY = '201812'),
            (SELECT SUM(JF_AMOUNT) 
             FROM MAV.USA.JOB_BUD_FORECAST, MAV.USA.NOMINAL_PERIOD
             WHERE JF_JO_MN=(JO_MN) AND JF_FORECAST_TYPE=1 AND JF_NP_MN=NP_MN AND NP_PERIOD_KEY = '201812'),
            (SELECT SUM(JF_AMOUNT)
             FROM MAV.BR.JOB_BUD_FORECAST, MAV.BR.NOMINAL_PERIOD 
             WHERE JF_JO_MN=(JO_MN) AND JF_FORECAST_TYPE=1 AND JF_NP_MN=NP_MN AND NP_PERIOD_KEY = '201812'),
            0))*JO_PROBABILITY/100)/CUR_RATE)*
    COALESCE(((SELECT SUM(JB_CHARGE) 
               FROM MAV.UK.JOB_BUDFORM 
               WHERE JB_JO_MN=JO_MN AND JB_GRADE IN('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR') AND JB_REV=JO_BUD_REVISION)/
              (SELECT SUM(JB_CHARGE) 
               FROM MAV.UK.JOB_BUDFORM 
               WHERE JB_JO_MN=JO_MN AND JB_GRADE NOT IN(' ') AND JB_REV=JO_BUD_REVISION)),
             ((SELECT SUM(JB_CHARGE) 
               FROM MAV.USA.JOB_BUDFORM 
               WHERE JB_JO_MN=(JO_MN) AND JB_GRADE IN('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR') AND JB_REV=JO_BUD_REVISION)/
              (SELECT SUM(JB_CHARGE) 
               FROM MAV.USA.JOB_BUDFORM
               WHERE JB_JO_MN=(JO_MN) AND JB_GRADE NOT IN(' ') AND JB_REV=JO_BUD_REVISION)),
             ((SELECT SUM(JB_CHARGE) 
               FROM MAV.BR.JOB_BUDFORM 
               WHERE JB_JO_MN=(JO_MN) AND JB_GRADE IN('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR') AND JB_REV=JO_BUD_REVISION)/
              (SELECT SUM(JB_CHARGE) FROM MAV.BR.JOB_BUDFORM WHERE JB_JO_MN=(JO_MN) AND JB_GRADE NOT IN(' ') AND JB_REV=JO_BUD_REVISION)),
             0)

我的上帝:在好的SQL中,select中没有这样的select,我们必须使用子查询和/或join

坏SQL

(select A from toto where A=T.AA), T.*
from mytable T
正确的SQL(ANSI 92)

正确的SQL(旧SQL或由bot生成)

如果B可以等于零且没有错误,则回答A/B的问题:

select
case 
  when coalesce(T.B,0)<> 0 
    then T.A/T.B 
end
from my_table as T
选择
案例
当聚结(T.B,0)0
然后T.A/T.B
结束
从我的桌子上

选择
案例
当聚结(T.B,0)0
然后T.A/T.B
其他0
结束
从我的桌子上

我的上帝:在好的SQL中,select中没有类似的select,我们必须使用子查询和/或join

坏SQL

(select A from toto where A=T.AA), T.*
from mytable T
正确的SQL(ANSI 92)

正确的SQL(旧SQL或由bot生成)

如果B可以等于零且没有错误,则回答A/B的问题:

select
case 
  when coalesce(T.B,0)<> 0 
    then T.A/T.B 
end
from my_table as T
选择
案例
当聚结(T.B,0)0
然后T.A/T.B
结束
从我的桌子上

选择
案例
当聚结(T.B,0)0
然后T.A/T.B
其他0
结束
从我的桌子上

对该查询要做的第一件事是对其进行格式化,使其仅能被人类读取。例如,我将该怪物添加到单词
中,选择
,然后粘贴,然后点击格式按钮显示以下内容:

SELECT
    (((COALESCE( (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.UK.JOB_BUD_FORECAST
           , MAV.UK.NOMINAL_PERIOD
        WHERE JF_JO_MN = JO_MN
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.USA.JOB_BUD_FORECAST
           , MAV.USA.NOMINAL_PERIOD
        WHERE JF_JO_MN = (JO_MN)
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.BR.JOB_BUD_FORECAST
           , MAV.BR.NOMINAL_PERIOD
        WHERE JF_JO_MN = (JO_MN)
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , 0 ))
    * JO_PROBABILITY / 100)
    / CUR_RATE
    ) * COALESCE( ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.UK.JOB_BUDFORM
        WHERE JB_JO_MN = JO_MN
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.UK.JOB_BUDFORM
        WHERE JB_JO_MN = JO_MN
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.USA.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.USA.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.BR.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.BR.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), 0 )
我认为大部分数据可以来源于两个连接的子查询,如下所示:

SELECT
  , jo.JO_MN           , jo.JO_BUD_REVISION
  , jo.JO_PROBABILITY  , jo.CUR_RATE
  , s1.SUM_JF_AMOUNT   , s2.SUM_JB_CHARGE_IN , s2.SUM_JB_CHARGE_NOT_IN
FROM unknown_table jo
LEFT JOIN (
        SELECT
            JF_JO_MN
          , SUM( JF_AMOUNT )                      AS SUM_JF_AMOUNT
        FROM MAV.UK.JOB_BUD_FORECAST
        INNER JOIN MAV.UK.NOMINAL_PERIOD ON JF_NP_MN = NP_MN
        WHERE JF_FORECAST_TYPE = 1
        AND NP_PERIOD_KEY = '201812'
        GROUP BY
            JF_JO_MN
    ) s1 ON JF_JO_MN = JO_MN
LEFT JOIN (
        SELECT
            JB_REV
          , SUM( CASE
                WHEN JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR') 
                THEN JB_CHARGE
            END )                                 AS SUM_JB_CHARGE_IN
          , SUM( CASE
                WHEN JB_GRADE NOT IN (' ') 
                THEN JB_CHARGE
            END )                                 AS SUM_JB_CHARGE_NOT_IN
        FROM MAV.UK.JOB_BUDFORM
        WHERE (
                JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
             OR JB_GRADE NOT IN (' ')
              )
        GROUP BY
            JB_REV
    ) s2 ON JB_REV = JO_BUD_REVISION
如果您使用这样的查询结构,您可以更容易地访问想要的数字,空值问题也可以很容易地解决


注意您需要改进每个子查询的连接语法。帮你自己一个忙,不要在表名之间使用逗号,这将有助于你采用“更新的”语法(这是25年前发布的).

对该查询要做的第一件事是对其进行格式化,使其仅能被人类读取。例如,我将该怪物添加到单词
中,选择
,然后粘贴,然后点击格式按钮显示:

SELECT
    (((COALESCE( (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.UK.JOB_BUD_FORECAST
           , MAV.UK.NOMINAL_PERIOD
        WHERE JF_JO_MN = JO_MN
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.USA.JOB_BUD_FORECAST
           , MAV.USA.NOMINAL_PERIOD
        WHERE JF_JO_MN = (JO_MN)
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , (
        SELECT
            SUM( JF_AMOUNT )
        FROM MAV.BR.JOB_BUD_FORECAST
           , MAV.BR.NOMINAL_PERIOD
        WHERE JF_JO_MN = (JO_MN)
        AND JF_FORECAST_TYPE = 1
        AND JF_NP_MN = NP_MN
        AND NP_PERIOD_KEY = '201812'
    )
    , 0 ))
    * JO_PROBABILITY / 100)
    / CUR_RATE
    ) * COALESCE( ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.UK.JOB_BUDFORM
        WHERE JB_JO_MN = JO_MN
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.UK.JOB_BUDFORM
        WHERE JB_JO_MN = JO_MN
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.USA.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.USA.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), ((
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.BR.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
        AND JB_REV = JO_BUD_REVISION
    )
    / (
        SELECT
            SUM( JB_CHARGE )
        FROM MAV.BR.JOB_BUDFORM
        WHERE JB_JO_MN = (JO_MN)
        AND JB_GRADE NOT IN (' ')
        AND JB_REV = JO_BUD_REVISION
    )
    ), 0 )
我认为大部分数据可以来源于两个连接的子查询,如下所示:

SELECT
  , jo.JO_MN           , jo.JO_BUD_REVISION
  , jo.JO_PROBABILITY  , jo.CUR_RATE
  , s1.SUM_JF_AMOUNT   , s2.SUM_JB_CHARGE_IN , s2.SUM_JB_CHARGE_NOT_IN
FROM unknown_table jo
LEFT JOIN (
        SELECT
            JF_JO_MN
          , SUM( JF_AMOUNT )                      AS SUM_JF_AMOUNT
        FROM MAV.UK.JOB_BUD_FORECAST
        INNER JOIN MAV.UK.NOMINAL_PERIOD ON JF_NP_MN = NP_MN
        WHERE JF_FORECAST_TYPE = 1
        AND NP_PERIOD_KEY = '201812'
        GROUP BY
            JF_JO_MN
    ) s1 ON JF_JO_MN = JO_MN
LEFT JOIN (
        SELECT
            JB_REV
          , SUM( CASE
                WHEN JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR') 
                THEN JB_CHARGE
            END )                                 AS SUM_JB_CHARGE_IN
          , SUM( CASE
                WHEN JB_GRADE NOT IN (' ') 
                THEN JB_CHARGE
            END )                                 AS SUM_JB_CHARGE_NOT_IN
        FROM MAV.UK.JOB_BUDFORM
        WHERE (
                JB_GRADE IN ('AUT', 'EDT', 'FMAN', 'FPRN', 'FDIR', 'SAUT', 'FDIR')
             OR JB_GRADE NOT IN (' ')
              )
        GROUP BY
            JB_REV
    ) s2 ON JB_REV = JO_BUD_REVISION
如果您使用这样的查询结构,您可以更容易地访问想要的数字,空值问题也可以很容易地解决


注意您需要改进每个子查询的连接语法。帮你自己一个忙,不要在表名之间使用逗号,这将有助于你采用“更新的”语法(25年前发布)。

你好,阿南德金,对不起,你的查询看起来很难理解,你能不能放一张数据库图的图像?这将更有帮助,并解释加速的结果。这些类型的查询破坏了所有良好的实践,可能会变得难以管理,需要有人对其进行整理。我要做的是从Scratch开始做所有事情没有简单的解决方案,因为整个查询是一场灾难,在干净的代码中,您可以用isnull或case简单地修复它。对于任何未来的问题,请包括完整的查询,而不仅仅是其中的一部分。正如你将在我下面的回答中看到的,我不得不猜测我的部分回答。我还敦促您使用SQL的格式,如果SQL易于阅读,您的编码生活将更有效率。嗨,阿南德金,对不起,您的查询看起来很难理解,请您放一张数据库图的图像好吗?这将更有帮助,并解释加速的结果。这些类型的查询破坏了所有良好的实践,可能会变得难以管理,需要有人对其进行整理。我要做的是从Scratch开始做所有事情没有简单的解决方案,因为整个查询是一场灾难,在干净的代码中,您可以用isnull或case简单地修复它。对于任何未来的问题,请包括完整的查询,而不仅仅是其中的一部分。正如你将在我下面的回答中看到的,我不得不猜测我的部分回答。我还敦促你使用SQL的格式,如果你的SQL易于阅读,那么你的编码生活将更有效率。大家好,几小时前我写了第一篇文章后刚刚醒来……很惊讶已经有了两个答案。谢谢你的时间,菲尔,克里斯蒂娜,你已经用过了!!!我没有写这段代码,一位前雇员写了,我甚至不能写,因为我是一名初学者(SQL不是我工作所必需的,但对我来说是有益的),而且很难从他的代码中学习!我昨晚确实让它工作了,但是这里没有足够的角色来展示你们中的任何人(如果你们想看的话)。我也很感激你们给我的建议,让我以后的帖子(如果有的话)能更有效地为你们提供帮助。大家好,几个小时前我写了第一篇帖子后才醒过来……很惊讶已经有了两个答案。谢谢你的时间,菲尔,克里斯蒂娜,你已经用过了!!!我没有写这段代码,一位前雇员写了,我甚至不能写,因为我是一名初学者(SQL不是我工作所必需的,但对我来说是有益的),而且很难从他的代码中学习!我昨晚确实让它工作了,但是这里没有足够的角色来展示你们中的任何人(如果你们想看的话)。我也很感谢你们的建议,让我未来的帖子(如果有的话)更有效地为你们提供帮助。