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

时间:2021-03-22 06:15:24

标签: sql sql-server tsql integer-division

我正在尝试为表格中的某些错误创建一个百分比。 我构建了一个查询,它带来每个值的错误数量、总错误数和除法。 但总是给我 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 
             ,sum(nullif(count(  [ZZ0010] ),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

1 个答案:

答案 0 :(得分:1)

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

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
  • 我不认为子查询在这种情况下特别有用,但如果您不想重复这些表达式,当然可以使用子查询。
相关问题