即使值是数字,百分比计算也总是返回 0

问题描述

我正在尝试为表格中的某些错误创建一个百分比。 我构建了一个查询,它带来每个值的错误数量、总错误数和除法。 但总是给我 0(我添加一个检查以查看值是否为数字)。

select 
ZZ0010 as Error_type,qty,total,running_sum,isnumeric(total),isnumeric(running_sum),running_sum/total

from (
    select ZZ0010,(count(  [ZZ0010] )) as qty,sum(nullif(count(  [ZZ0010] ),0) ) over(order by count(  [ZZ0010] )  desc,ZZ0010) as running_sum,0) ) over() as total
    from md.CAR_CRM_DS_ZCRM_Z101_BUSInesS_ATTR_VT   
    group by ZZ0010
    having (count(  [ZZ0010] )) is not null 
                                                ) tbl
order by running_sum asc
错误类型 数量 总计 running_sum isnumeric(total) isnumeric(running_sum) running_sum/total
2 2123 3931 2123 1 1 0
10 1808 3931 3931 1 1 0

解决方法

嗯。 . .我认为你可以从根本上简化这个:

select ZZ0010,count(*) as qty,sum(count(*)) over (order by count(*) desc) as running_sum,sum(count(*)) over () as total,( sum(count(*)) over (order by count(*) desc) * 1.0 /
         nullif(sum(count(*)) over (),0)
       ) as ratio
from md.CAR_CRM_DS_ZCRM_Z101_BUSINESS_ATTR_VT   
group by ZZ0010;

注意事项:

  • 我不知道你为什么要在数字列上使用 isnumeric()
  • COUNT() 不能返回 NULL,因此 HAVING 是多余的。
  • 使用 NULLIF() 避免除以 0。当然,除非所有行都将 ZZ0010 设为 NULL,否则查询中的计数总和不能为零。
  • SQL Server 进行整数除法。我只是乘以 1.0 来避免这种情况。
  • NULLIF(COUNT(),0) 真的很奇怪。为什么要在忽略空值的列中区分 0NULL
  • 我不认为子查询在这种情况下特别有用,但如果您不想重复这些表达式,当然可以使用子查询。