簡體   English   中英

SQL除以零錯誤

[英]SQL Divide by Zero Error

我有一個惱人的問題,它阻止我生成一些數據; SQL作業總共有23個步驟,在21日失敗。

-- Step 21 Create the table z1QReportOverview
-- Create z1QReportProjectOverview.sql
-- Project Overview - By Category (Part 4).sql
USE database
SELECT z1QReportProjectOverview1.[ERA Category] AS Category,
z1QReportProjectOverview1.[Total Projects Signed],
z1QReportProjectOverview1.[Total Spend Under Review],
z1QReportProjectOverview1.[Avg. Project Size],
z1QReportProjectOverview2.[Work in Progress],
z1QReportProjectOverview2.[Implemented],
z1QReportProjectOverview2.[No Savings],
z1QReportProjectOverview2.[Lost],
CONVERT(decimal(18,0),[Lost])/CONVERT(decimal(18,0),[Total Projects Signed]) AS [Loss Ratio],
z1QReportProjectOverview2.[Completed],
(
    CONVERT(decimal(18,0),([Completed]+[Implemented]))/
    CONVERT(decimal(18,0),([Completed]+[Implemented]+[Lost]))
) 
AS [Success Ratio],
z1QReportProjectOverview3.[Avg. Spend] AS [Average Spend],
z1QReportProjectOverview3.[Avg. Savings] AS [Average Savings],
z1QReportProjectOverview3.[Avg. Savings %] AS [Average Savings %]
INTO dbo.z1QReportProjectOverview
FROM dbo.z1QReportProjectOverview1
JOIN dbo.z1QReportProjectOverview2
ON (z1QReportProjectOverview1.[ERA Category] = z1QReportProjectOverview2.[ERA    Category])
JOIN dbo.z1QReportProjectOverview3
ON (z1QReportProjectOverview2.[ERA Category] = z1QReportProjectOverview3.[ERA     Category])
ORDER BY Category

我相信我知道造成零誤差的原因是什么。

“丟失”字段由三個字段組成,在某些情況下(非常罕見),所有3個字段均為0,在“丟失”字段中產生0。

我相信這是錯誤的主要原因,但是那里還有第二個分區,我在SQL上非常垃圾,因此我的問題是:

我應該在哪里放置CASE WHEN條款?

- 最有可能寫錯了這個:(“當[丟失] = 0時設置[設置的項目總數] = 0”

任何建議都非常感謝!

使用NULLIF來處理除零錯誤

........
Isnull(CONVERT(DECIMAL(18, 0), [Lost]) / NULLIF(CONVERT(DECIMAL(18, 0), [Total Projects Signed]), 0), 0) AS [Loss Ratio],
Isnull(CONVERT(DECIMAL(18, 0), ( [Completed] + [Implemented] )) /
                        NULLIF(CONVERT(DECIMAL(18, 0), ( [Completed] + [Implemented] + [Lost] )), 0), 0) AS [Success Ratio], 
........

您可以使用CASE來檢查除數值是否為0

CASE WHEN CONVERT(decimal(18,0),[Lost]) <> 0 THEN 
        CONVERT(decimal(18,0),[Lost])/CONVERT(decimal(18,0),[Total Projects Signed]) 
     ELSE 0 END AS [Loss Ratio],
z1QReportProjectOverview2.[Completed],
CASE WHEN CONVERT(decimal(18,0),([Completed]+[Implemented]+[Lost])) <> 0 THEN 
      (CONVERT(decimal(18,0),([Completed]+[Implemented]))/CONVERT(decimal(18,0),([Completed]+[Implemented]+[Lost]))) 
    ELSE 0 END AS [Success Ratio],

你可以這樣使用CASE WHEN

CASE 
     -- check if either value is 0 (which will cause error)
     WHEN CONVERT(decimal(18,0),[Lost]) = 0
       OR CONVERT(decimal(18,0),[Total Projects Signed]) = 0
     -- if so, return 0
     THEN 0
     -- otherwise perform calculation
     ELSE CONVERT(decimal(18,0),[Lost])/CONVERT(decimal(18,0),[Total Projects Signed])
END AS [Loss Ratio]

@皮匠:

所以布局這樣的代碼應該工作得很好嗎?

CONVERT(decimal(18,0),[Lost])/CONVERT(decimal(18,0),[Total Projects Signed]) AS [Loss Ratio],
CASE 
 -- check if either value is 0 (which will cause error)
 WHEN CONVERT(decimal(18,0),[Lost]) = 0
   OR CONVERT(decimal(18,0),[Total Projects Signed]) = 0
 -- if so, return 0
 THEN 0
 -- otherwise perform calculation
ELSE CONVERT(decimal(18,0),[Lost])/CONVERT(decimal(18,0),[Total Projects Signed])
END AS [Loss Ratio]
z1QReportProjectOverview2.[Completed],
(
    CONVERT(decimal(18,0),([Completed]+[Implemented]))/
    CONVERT(decimal(18,0),([Completed]+[Implemented]+[Lost]))
) 
AS [Success Ratio],

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM