0

The following query utilizes a case statement with some division. However, it is getting snagged on a division by zero error. Any ideas on how to handle the error exception would be greatly appreciated!

CASE 
    WHEN Channel = 'DA' THEN  CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID) 
    WHEN Channel = 'SS' THEN  CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID) 
    WHEN Channel = 'XDOCK' THEN  CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
    WHEN Channel = '?' THEN  CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID) 
    ELSE 0
    END AS Percentage
Jeremy
  • 779
  • 3
  • 9
  • 14

2 Answers2

3

Simply use NULLIF. Additionally you can simplify your query to:

CASE 
    WHEN Channel IN ('DA','SS','XDOCK','?') 
      THEN Cast(CASE_QTY AS DECIMAL(38,0))/NullIf(Sum(Cast(CASE_QTY AS DECIMAL(38,2))) Over (PARTITION BY ld.LOAD_ID),0) 
    ELSE 0
END AS Percentage
dnoeth
  • 59,503
  • 4
  • 39
  • 56
1

You can check with another case

  CASE  WHEN SUM(CAST(CASE_QTY AS DECIMAL(38,2)) <> 0 THEN
              WHEN Channel = 'DA' THEN  CAST (CASE_QTY AS DECIMAL(38,0))/SUM(CAST(CASE_QTY AS DECIMAL(38,2))) OVER (PARTITION BY ld.LOAD_ID)
        THEN -1 /*  or the value you prefer for zero value */
        END
   ....  
ScaisEdge
  • 131,976
  • 10
  • 91
  • 107