0

我有除以零错误。请帮助我。

    ,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
4

3 回答 3

1

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

于 2013-04-26T06:20:38.407 回答
0

在 SQL Server 中使用 Try & 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 块处理。

于 2013-04-26T06:20:59.467 回答
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上的简单演示

于 2013-04-26T07:50:09.823 回答