除以零错误

时间:2013-04-26 06:15:08

标签: sql sql-server

我有一个零除错误。请帮助我。

    ,CASE U.BasePool 
        WHEN 0 THEN 'N/A'
        WHEN -1 THEN 'N/A'
        ELSE CASE 
                WHEN SUM(SUM(B.TransactionCount)) OVER (Partition by U.ContractID) > U.BasePool THEN 'IN-OVERAGE'
                --WHEN SUM(SUM(B.TransactionCount)) OVER (Partition by U.ContractID) + (SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)/MonthNum) > U.BasePool THEN DATEADD(MM, 1, GETDATE())
                ELSE  CONVERT(VARCHAR(20),DATEADD(MM,CAST(ROUND((U.BasePool - SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)) 
                            /(SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)/MonthNum),0) as INT), GETDATE()),101)

                --(basepool - sumcontract) / (sumcontract/monthNum ) is the expected months to reach overage
            END 

        END AS  ExpectedDate

3 个答案:

答案 0 :(得分:1)

在这种情况下,请先检查(SUM(SUM(B.TransactionCount)) OVER (Partition by U.ContractID)/MonthNum),0) as INT) = 0。如果是这样,请返回您想要的特定值(如NULL)。

答案 1 :(得分:0)

使用Try& SQL Server中的Catch:从MSDN获取的引用 语法如下。

BEGIN TRY
    SELECT *
        FROM sys.messages
        WHERE message_id = 21;
END TRY
GO
-- The previous GO breaks the script into two batches,
-- generating syntax errors. The script runs if this GO
-- is removed.
BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH;
GO

在Begin Try块中,您可以编写语句,如果在语句中发生任何错误,那么它将由Catch块处理。

答案 2 :(得分:0)

尝试使用ISNULL(../ NULLIF())检查表达式

的CASE
,CASE U.BasePool 
    WHEN 0 THEN 'N/A'
    WHEN -1 THEN 'N/A'
    ELSE CASE 
            WHEN SUM(SUM(B.TransactionCount)) OVER (Partition by U.ContractID) > U.BasePool THEN 'IN-OVERAGE'
            --WHEN SUM(SUM(B.TransactionCount)) OVER (Partition by U.ContractID) + (SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)/MonthNum) > U.BasePool THEN DATEADD(MM, 1, GETDATE())
            ELSE  ISNULL(CONVERT(VARCHAR(20),DATEADD(MM,CAST(ROUND((U.BasePool - SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)) 
                        /NULLIF((SUM(SUM(B.TransactionCount))  OVER (Partition by U.ContractID)/MonthNum), 0), 0) as INT), GETDATE()) ,101), 0)
            --(basepool - sumcontract) / (sumcontract/monthNum ) is the expected months to reach overage
        END 
    END AS  ExpectedDate

SQLFiddle

上的简单演示