2

任何方式我都有以下形式的查询

select 
(select count(*) from sometable where somecritiea) / ((select count(*) from sometable where somecritiea) + 0.000001) 
from sometable

我将计数结果除以计数结果,因此空值不是问题。

当我运行它时,我得到一个“遇到除以零错误。”。注意除数中的 +0.000001。

如果我将枚举数(?)和除数插入一个新表中,然后执行相同的计算,它会按预期工作。

select 
(select count(*) from sometable where somecritiea) a/ ((select count(*) from sometable where somecritiea) + 0.000001) b
into testtable
from sometable

从测试表中选择 a/b

这将返回没有错误的预期结果。

如果我跑

select * from testtable where b = 0
i get 0 records as expected.

我真的失去了它,这是一个 5 分钟的工作,已经变成了一个 5 小时的混乱。

我也试过

select *
((select count(*) from sometable where somecritiea) + 0.000001) divisor
from sometable
where divisor = 0

这不返回任何记录。

4

3 回答 3

3

老实说,我也无法重现您的问题,但这无论如何都应该有效。

WITH Divisor AS (select count(*)*1.0 BotCnt from sys.procedures),
    Dividend AS (select count(*)*1.0 TopCnt from sys.tables )
SELECT 
    CASE WHEN BotCnt = 0 THEN 0 ELSE TopCnt/BotCnt END,
    *
FROM sys.objects
CROSS JOIN Divisor
CROSS JOIN Dividend

注意*1.0. 也就是将计数转换为小数。您可以轻松地使用显式转换。CROSS JOIN 仅起作用,因为两个 CTE 是单行的。否则使用带有 ON 子句的 INNER JOIN。

于 2013-03-23T01:32:38.040 回答
1

这是我可以快速复制您的场景的最接近的方法,并且效果很好;返回 0.0000000:

with sometable as (
  select * from ( values 
    (0)
  ) sometable(value)
)
select 
  (select count(*) from sometable where value <> 0 )
/ 
( (select count(*) from sometable where value <> 0 ) + 0.000001 ) 
from sometable
于 2013-03-23T01:35:15.750 回答
0

试试NULLIF你的除数

select 
(select count(*) from sometable where somecritiea) / NULLIF((select count(*) from sometable     where somecritiea) + 0.000001), 0) from sometable

每当分母为 0 时,这将返回NULL而不是除以 0。如果您不想要NULL其他默认答案(例如 9),ISNULL请在整个查询中使用将其转换回 0。

于 2013-03-23T09:34:13.417 回答