Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 百分比计算始终返回0,即使值是数字_Sql_Sql Server_Tsql_Integer Division - Fatal编程技术网

Sql 百分比计算始终返回0,即使值是数字

Sql 百分比计算始终返回0,即使值是数字,sql,sql-server,tsql,integer-division,Sql,Sql Server,Tsql,Integer Division,我正在尝试为表中的某些错误创建一个百分比。 我构建了一个查询,其中包含每个值的错误数量、错误总数和除法。 但总是给我0(我添加了一个检查,以查看值是否为数字) 错误类型 数量 全部的 流水 数字(总计) isnumeric(运行求和) 运行总数/总计 2. 2123 3931 2123 1. 1. 0 10 1808 3931 3931 1. 1. 0 嗯。我认为你可以从根本上简化这一点: select ZZ0010, count(*) as qty, sum(cou

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

错误类型 数量 全部的 流水 数字(总计) isnumeric(运行求和) 运行总数/总计 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()
  • 使用
    NULLIF()
    避免被
    0
    除法。当然,除非所有行都具有
    ZZ0010
    作为
    NULL
    ,否则查询中的计数总和不能为零
  • SQLServer进行整数除法。我只是乘以
    1.0
    来避免这种情况
  • NULLIF(COUNT(),0)
    真的很奇怪。为什么在忽略空值的列中区分
    0
    NULL
  • 我不认为子查询在这种情况下特别有用,但是如果不想重复表达式,当然可以使用子查询

整数除法。乘以
1.0
将其改为小数
运行_sum*1.0/total
U是正确的!这么简单的解决方案!谢谢
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;