2011-10-12 73 views
0
SELECT 
    * 
FROM 
    RM_Sales_Union 
WHERE 
    DOCDATE >= 'September 1, 2011' 
    AND DOCDATE < 'October 1, 2011' 
    AND CUSTNMBR = '2186020' 

將查詢結果中的錯誤:解決除以零錯誤在SQL SELECT

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

如果運行如圖所示。

排除最後一行AND CUSTNMBR = '2186020'允許查詢完成。

CUSTNMBRchar(21)字段。除以零讓我困惑。

什麼是「正確」的方法來解決這個問題?

RM_Sales_Union是聯合查詢視圖:

SELECT ACTNUMBR_1, 
     ACTNUMBR_2, 
     ACTNUMBR_3, 
     ORSLSAMT, 
     CUSTCLAS, 
     CUSTNAME, 
     CUSTNMBR, 
     SLPRSNID, 
     DOCABREV, 
     CSPORNBR, 
     CURNCYID, 
     DOCDATE, 
     DOCNUMBR, 
     GLPOSTDT, 
     SLSAMNT, 
     VOIDSTTS, 
     SLPRSNFN, 
     SPRSNSLN, 
     DocOrigin, 
     ORFRTAMT, 
     FRTAMNT, 
     COMPRCNT, 
     TRDISAMT, 
     ORTDISAM, 
     ORMISCAMT, 
     ORTAXAMT, 
     ORCTRXAM 
FROM dbo.RM_Sales_Hist 
UNION 
SELECT ACTNUMBR_1, 
     ACTNUMBR_2, 
     ACTNUMBR_3, 
     ORSLSAMT, 
     CUSTCLAS, 
     CUSTNAME, 
     CUSTNMBR, 
     SLPRSNID, 
     DOCABREV, 
     CSPORNBR, 
     CURNCYID, 
     DOCDATE, 
     DOCNUMBR, 
     GLPOSTDT, 
     SLSAMNT, 
     VOIDSTTS, 
     SLPRSNFN, 
     SPRSNSLN, 
     DocOrigin, 
     ORFRTAMT, 
     FRTAMNT, 
     COMPRCNT, 
     TRDISAMT, 
     ORTDISAM, 
     ORMISCAMT, 
     ORTAXAMT, 
     ORCTRXAM 
FROM dbo.RM_Sales_Open 

RM_Sales_Hist和RM_Sales_Open是定義的視圖如下:

--RM_Sales_Hist 
SELECT dbo.GL_Sales_Accounts.ACTNUMBR_1, 
     dbo.GL_Sales_Accounts.ACTNUMBR_2, 
     dbo.GL_Sales_Accounts.ACTNUMBR_3, 
     ISNULL(dbo.MC020102.ORSLSAMT, dbo.RM30101.SLSAMNT) AS ORSLSAMT, 
     dbo.RM00101.CUSTCLAS, 
     dbo.RM00101.CUSTNAME, 
     dbo.RM00101.CUSTNMBR, 
     dbo.RM00101.SLPRSNID, 
     dbo.RM40401.DOCABREV, 
     dbo.RM30101.CSPORNBR, 
     dbo.RM30101.CURNCYID, 
     dbo.RM30101.DOCDATE, 
     dbo.RM30101.DOCNUMBR, 
     dbo.RM30101.GLPOSTDT, 
     dbo.RM30101.SLSAMNT, 
     dbo.RM30101.VOIDSTTS, 
     dbo.RM00301.SLPRSNFN, 
     dbo.RM00301.SPRSNSLN, 
     'HIST'            AS DocOrigin, 
     ISNULL(dbo.MC020102.ORFRTAMT, dbo.RM30101.FRTAMNT) AS ORFRTAMT, 
     dbo.RM30101.FRTAMNT, 
     dbo.RM00301.COMPRCNT, 
     dbo.RM30101.TRDISAMT, 
     ISNULL(dbo.MC020102.ORTDISAM, 0)     AS ORTDISAM, 
     ISNULL(dbo.MC020102.ORMISCAMT, 0)     AS ORMISCAMT, 
     ISNULL(dbo.MC020102.ORTAXAMT, 0)     AS ORTAXAMT, 
     ISNULL(dbo.MC020102.ORCTRXAM, 0)     AS ORCTRXAM, 
     dbo.RM00101.STATE 
FROM dbo.GL_Sales_Accounts 
     INNER JOIN dbo.RM30301 
     ON dbo.GL_Sales_Accounts.DSTINDX = dbo.RM30301.DSTINDX 
     INNER JOIN dbo.RM30101 
     ON dbo.RM30301.CUSTNMBR = dbo.RM30101.CUSTNMBR 
      AND dbo.RM30301.DOCNUMBR = dbo.RM30101.DOCNUMBR 
     INNER JOIN dbo.RM00101 
     ON dbo.RM30101.CUSTNMBR = dbo.RM00101.CUSTNMBR 
     INNER JOIN dbo.RM40401 
     ON dbo.RM30101.RMDTYPAL = dbo.RM40401.RMDTYPAL 
     INNER JOIN dbo.RM00301 
     ON dbo.RM00101.SLPRSNID = dbo.RM00301.SLPRSNID 
     LEFT OUTER JOIN dbo.MC020102 
     ON dbo.RM30301.DOCNUMBR = dbo.MC020102.DOCNUMBR 
WHERE (CAST(dbo.RM30301.DOCNUMBR AS VARCHAR(21)) NOT IN (SELECT 
     CAST(
                   DOCNUMBR AS 
                   VARCHAR(21)) AS 
     Expr1 
                  FROM 
        dbo.Invoices_With_Display_Discounts)) 

--RM_Sales_Open 
SELECT dbo.GL_Sales_Accounts.ACTNUMBR_1, 
     dbo.GL_Sales_Accounts.ACTNUMBR_2, 
     dbo.GL_Sales_Accounts.ACTNUMBR_3, 
     ISNULL(dbo.MC020102.ORSLSAMT, 0) AS ORSLSAMT, 
     dbo.RM00101.CUSTCLAS, 
     dbo.RM00101.CUSTNAME, 
     dbo.RM00101.CUSTNMBR, 
     dbo.RM00101.SLPRSNID, 
     dbo.RM40401.DOCABREV, 
     dbo.RM20101.CSPORNBR, 
     dbo.RM20101.CURNCYID, 
     dbo.RM20101.DOCDATE, 
     dbo.RM20101.DOCNUMBR, 
     dbo.RM20101.GLPOSTDT, 
     dbo.RM20101.SLSAMNT, 
     dbo.RM20101.VOIDSTTS, 
     dbo.RM00301.SLPRSNFN, 
     dbo.RM00301.SPRSNSLN, 
     'OPEN'       AS DocOrigin, 
     ISNULL(dbo.MC020102.ORFRTAMT, 0) AS ORFRTAMT, 
     dbo.RM20101.FRTAMNT, 
     dbo.RM00301.COMPRCNT, 
     dbo.RM20101.TRDISAMT, 
     ISNULL(dbo.MC020102.ORTDISAM, 0) AS ORTDISAM, 
     ISNULL(dbo.MC020102.ORMISCAMT, 0) AS ORMISCAMT, 
     ISNULL(dbo.MC020102.ORTAXAMT, 0) AS ORTAXAMT, 
     ISNULL(dbo.MC020102.ORCTRXAM, 0) AS ORCTRXAM, 
     dbo.RM00101.STATE 
FROM dbo.GL_Sales_Accounts 
     INNER JOIN dbo.RM10101 
     ON dbo.GL_Sales_Accounts.DSTINDX = dbo.RM10101.DSTINDX 
     INNER JOIN dbo.RM20101 
     ON dbo.RM10101.CUSTNMBR = dbo.RM20101.CUSTNMBR 
      AND dbo.RM10101.DOCNUMBR = dbo.RM20101.DOCNUMBR 
     INNER JOIN dbo.RM00101 
     ON dbo.RM20101.CUSTNMBR = dbo.RM00101.CUSTNMBR 
     INNER JOIN dbo.RM40401 
     ON dbo.RM20101.RMDTYPAL = dbo.RM40401.RMDTYPAL 
     INNER JOIN dbo.RM00301 
     ON dbo.RM00101.SLPRSNID = dbo.RM00301.SLPRSNID 
     LEFT OUTER JOIN dbo.MC020102 
     ON dbo.RM10101.DOCNUMBR = dbo.MC020102.DOCNUMBR 
WHERE (CAST(dbo.RM20101.DOCNUMBR AS VARCHAR(21)) NOT IN (SELECT 
     CAST(
                   DOCNUMBR AS 
                   varchar(21)) AS 
     Expr1 
                  FROM 
        dbo.Invoices_With_Display_Discounts)) 
+3

RM_Sales_Union是一個視圖嗎?如果是這樣,請告訴我們定義請 – gbn

+1

我看不到任何可能導致此錯誤的查詢。 RM_Sales_Union表是否有任何可能引發此錯誤的計算字段? – David

+0

添加了查詢的更多定義。沒有計算字段。是的,查詢是醜陋的和可怕的嵌套... –

回答

5

我想這RM_Sales_Union是包含分割的圖。過濾器只是簡單地改變COUNT或SUM之類的東西給零,並且它用作除數

將其更改爲使用something/NULLIF(..., 0)使表達式爲NULL。或ISNULL(something/NULLIF(..., 0), 0)以獲得NULL而不是