除以0错误和CASE - SQL

时间:2016-02-27 20:26:22

标签: sql division

我正在尝试运行下面的查询并继续得到除以0的错误。有时候除数中的平均值可以是0.如果我使用HAVING语句,其中平均值> 0,则相同的查询有效。 0.但是,那些有效值将从结果中排除。

SELECT B.facility_desc Well,
B.facility_id   "Facility ID",
( Cast(C.value AS NUMERIC(6, 0)) ),
( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ),
( ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) - ( Cast(C.value AS NUMERIC(6, 0)) ) ),
CASE
WHEN ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) = 0 THEN NULL
ELSE (( ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) - ( Cast(C.value AS NUMERIC(6, 0)) ) ) / ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) )
END,
D.desc
FROM   houston_vhs.historicalvalues A
LEFT JOIN houston_fac.fac_header B
ON LEFT(A.pointidlong, 10) = B.facility_id
LEFT JOIN houston_uis.realtimevalues C
ON LEFT(A.pointidlong, 10) = C.facilityid
LEFT JOIN houston_trs.table_header_record D
ON B.facility_table5 = D.table_entry
WHERE  A.pointidlong LIKE 'DIMO_N8%_VGY'
AND A.pointtime > Now() - 7
AND A.unreliableflag = 'N'
AND B.facility_desc <> ''
AND B.facility_is_active = 'Y'
AND C.udc = 'RGAS'
AND C.value <> ''
GROUP  BY B.facility_desc,
B.facility_id,
C.value,
D.desc
ORDER  BY ( ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) - ( Cast(C.value AS NUMERIC(6, 0)) ) ) ASC

我已尝试将CASE语句的顺序更改为值&gt; 0然后等式,如果不是那么NULL无济于事。我也尝试过使用NULLIF,这也是不行的。任何见解都表示赞赏。

1 个答案:

答案 0 :(得分:0)

通常,SQL会依次评估CASE表达式。但是,在存在聚合函数的情况下,此规则变得更加模糊 - 因为需要首先计算聚合表达式。

一个简单的解决方法是使用nullif()

 (( ( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ) - ( Cast(C.value AS NUMERIC(6, 0)) ) ) / nullif( Avg(DISTINCT( Cast(A.value AS NUMERIC(6, 0)) )) ), 0 )

我想指出:我已经使用SQL多年(数十年),我从来没有理由使用AVG(DISTINCT)。这表明您的JOIN正在复制数据,此修复程序不是正确的解决方法。