Sql 百分比计算始终返回0,即使值是数字
我正在尝试为表中的某些错误创建一个百分比。 我构建了一个查询,其中包含每个值的错误数量、错误总数和除法。 但总是给我0(我添加了一个检查,以查看值是否为数字) 错误类型 数量 全部的 流水 数字(总计) isnumeric(运行求和) 运行总数/总计 2. 2123 3931 2123 1. 1. 0 10 1808 3931 3931 1. 1. 0Sql 百分比计算始终返回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
嗯。我认为你可以从根本上简化这一点:
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;