问题描述
我正在尝试为表格中的某些错误创建一个百分比。 我构建了一个查询,它带来每个值的错误数量、总错误数和除法。 但总是给我 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)
真的很奇怪。为什么要在忽略空值的列中区分0
和NULL
? - 我不认为子查询在这种情况下特别有用,但如果您不想重复这些表达式,当然可以使用子查询。