使用SQL处理因被零除而导致的错误
数据库引擎是一个叫做Paprika的金融软件。其目的是在2018年12月为某一特定部门提取收入 (2018年12月3个数据库(英国、美国、巴西)的项目价值工作概率/汇率)(部门工时基于等级/数据库总工时) 零值来自最后一部分(最后3分)——在为每个项目逐级提取小时数时,其中许多项目的小时数为零 以下是帮助台的评论:使用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_
“对视图进行编码的人可以在计算中添加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不是我工作所必需的,但对我来说是有益的),而且很难从他的代码中学习!我昨晚确实让它工作了,但是这里没有足够的角色来展示你们中的任何人(如果你们想看的话)。我也很感谢你们的建议,让我未来的帖子(如果有的话)更有效地为你们提供帮助。