Reputation: 829
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
Upvotes: 0
Views: 9305
Reputation: 60472
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
Upvotes: 3
Reputation: 133370
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
....
Upvotes: 1