除以2个数字将返回0

时间:2014-10-13 13:56:00

标签: sql sql-server sum

我试图划分2个计数以便返回一个百分比。

以下查询返回0

select (
    (select COUNT(*) from saxref..AuthCycle
         where endOfUse is null and addDate >= '1/1/2014') / 
    (select COUNT(*) from saxref..AuthCycle 
         where addDate >= '1/1/2014')
    ) as Percentage

我应该申请演员吗?

3 个答案:

答案 0 :(得分:2)

通过将公共条件移动到where子句可以更简洁地完成:

select sum(case when endOfUse is null then 1 end) * 100.0 / count(*) percentage
from saxref..AuthCycle
where addDate >= '1/1/2014'

请注意,0的情况也不需要为false,因为sum()

会忽略空值

答案 1 :(得分:1)

我会这样做,使用两个sum s:

select sum
       ( case
         when endOfUse is null and addDate >= '1/1/2014'
         then 1
         else 0
         end
       )
       * 100.0 -- if you want the usual 0..100 range for percentages
       /
       sum
       ( case
         when addDate >= '1/1/2014'
         then 1
         else 0
         end
       )
       percentage
from   saxref..AuthCycle

答案 2 :(得分:1)

该问题是由于您正在划分2 int个值而导致的,默认情况下会输出int,因为它会使用计算中使用的数据类型来确定输出的数据类型,因此如果你这样做有效:

select 50/100 as result

您将0.5输出为0,因为它将其舍入为int(无小数位)。

但是,如果您指定小数:

select 50.0/100.0 as result

你会得到0.5作为小数,你可以乘以100得到50%。

因此,更新语法以乘以1.0并将计数转换为小数将为您提供正确的结果:

select (
(select COUNT(*) from saxref..AuthCycle where endOfUse is null and addDate >= '1/1/2014')*1.0 / 
(select COUNT(*) from saxref..AuthCycle where addDate >= '1/1/2014')*1.0
) as Percentage