【问题标题】:Getting "Divide by zero error encountered" error while running the below query运行以下查询时出现“除以零错误”错误
【发布时间】:2017-04-10 20:57:08
【问题描述】:

我在尝试运行此查询时不确定该错误。它给了我除以零错误。此错误发生在第 1 行。

Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.

有人可以帮忙吗?

SELECT temp1.*,90  as Plan_val,max(cast(Round(temp2.actual,0) as int))  as actual_val FROM(
SELECT t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id FROM (
SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)],[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id
FROM TEMP_TICKET_STATE

UNION

SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)],[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id
FROM TEMP_TICKET_STATE
where  [Problem_Type_Name(Parent)]='Incident (Technical Issues)'  and PRIORITY_TYPE_NAME  in ('High') AND (ISNULL([Escalated to Closed time],0) <= 120 or ISNULL([Escalated to Resolved time],0) <=120)) t

group by t.[Problem_Type_Name(Parent)] ,t.[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id) temp1

INNER JOIN

(
SELECT t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)],0 AS plan_val, cast(Round((cast(sum(t.Total_tickets) as decimal(38,2))- cast(sum(t.Alarm_Val) as decimal(38,2)))/cast(sum(t.Total_tickets) as decimal(38,2))*100,0) as int) as actual  FROM (
SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)],0 as Alarm_Val, cast (count(distinct [Job_ticket_id])/4 as int) as Total_tickets 
FROM TEMP_TICKET_STATE_month
group by [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)] 

UNION

SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)],cast (count(distinct [Job_ticket_id])/4 as int) as Alarm_Val, 0 as Total_tickets 
FROM TEMP_TICKET_STATE_month
where  [Problem_Type_Name(Parent)]='Incident (Technical Issues)'  and PRIORITY_TYPE_NAME  in ('High') AND (ISNULL([Escalated to Closed time],0) <= 120 or ISNULL([Escalated to Resolved time],0) <=120)
group by [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)] ) t

group by t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)]) temp2

ON temp1.[Problem_Type_Name(Parent)]=temp2.[Problem_Type_Name(Parent)]
Group by temp1.[Assigned Tech],temp1.Close_Date,temp1.Job_ticket_id,temp1.NAME,temp1.[Problem_Type_Name(Parent)],temp1.[Problem_Type_Name(Child)] ,temp1.Report_Date

GO

【问题讨论】:

  • 请不要使用不适用于您的问题的标签
  • 这个没有实际数据是无法回答的。但是,你有很多部门发生了,所以这就是问题所在。尝试做一个 CASE 语句,如果分母为 0,则输出 NULL

标签: sql sql-server tsql casting common-table-expression


【解决方案1】:

据我所知,只有一个分母可以为零。其他的似乎是一个常数 4。

NullIf() 是一种用于捕获可怕的除以零 的简单技术。

例如 NullIf(&lt;any denominator&gt;,0) 如果分母 = 0,则返回 NULL

所以在你的情况下:

NullIf(cast(sum(t.Total_tickets) as decimal(38,2)),0)

【讨论】:

  • @SankW 很高兴它有帮助
【解决方案2】:

只有一个商可能失败 - 查询中有 3 个除法,还有 2 个除以常数。试试这个:

SELECT temp1.*,90  as Plan_val,max(cast(Round(temp2.actual,0) as int))  as actual_val FROM(
SELECT t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id FROM (
SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)],[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id
FROM TEMP_TICKET_STATE

UNION

SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)],[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id
FROM TEMP_TICKET_STATE
where  [Problem_Type_Name(Parent)]='Incident (Technical Issues)'  and PRIORITY_TYPE_NAME  in ('High') AND (ISNULL([Escalated to Closed time],0) <= 120 or ISNULL([Escalated to Resolved time],0) <=120)) t

group by t.[Problem_Type_Name(Parent)] ,t.[Problem_Type_Name(Child)] , REPORT_DATE, CLOSE_DATE,[Assigned Tech],NAME , Job_ticket_id) temp1

INNER JOIN

(
SELECT t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)],0 AS plan_val, 
    -- CHANGE IS THE CASE ON THE NEXT LINE!
    case when sum(t.Total_tickets) = 0 then null else cast(Round((cast(sum(t.Total_tickets) as decimal(38,2))- cast(sum(t.Alarm_Val) as decimal(38,2)))/cast(sum(t.Total_tickets) as decimal(38,2))*100,0) as int) end as actual  FROM (
SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)],0 as Alarm_Val, cast (count(distinct [Job_ticket_id])/4 as int) as Total_tickets 
FROM TEMP_TICKET_STATE_month
group by [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)] 

UNION

SELECT 'NOC Incident Resolution - High' as [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)],cast (count(distinct [Job_ticket_id])/4 as int) as Alarm_Val, 0 as Total_tickets 
FROM TEMP_TICKET_STATE_month
where  [Problem_Type_Name(Parent)]='Incident (Technical Issues)'  and PRIORITY_TYPE_NAME  in ('High') AND (ISNULL([Escalated to Closed time],0) <= 120 or ISNULL([Escalated to Resolved time],0) <=120)
group by [Problem_Type_Name(Parent)] ,[Problem_Type_Name(Child)] ) t

group by t.[Problem_Type_Name(Parent)],t.[Problem_Type_Name(Child)]) temp2

ON temp1.[Problem_Type_Name(Parent)]=temp2.[Problem_Type_Name(Parent)]
Group by temp1.[Assigned Tech],temp1.Close_Date,temp1.Job_ticket_id,temp1.NAME,temp1.[Problem_Type_Name(Parent)],temp1.[Problem_Type_Name(Child)] ,temp1.Report_Date

GO

【讨论】:

  • 这给了我以下错误:Msg 102, Level 15, State 1, Line 30 'temp2' 附近的语法不正确。
  • @SankW - 对不起,还有一个编辑...有几行从底部被砍掉了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多