SQL Server列与具有空值的列进行除法
我希望我的结果如下所示,hit1或hit0n1中的初始空值变为0,当hit1除以0时,百分比将变为0%SQL Server列与具有空值的列进行除法,sql,sql-server,Sql,Sql Server,我希望我的结果如下所示,hit1或hit0n1中的初始空值变为0,当hit1除以0时,百分比将变为0% Select CONVERT(varchar(10),ISNULL(a6.hit1*100,0)/NULLIF(a7.hit0n1, 0))+ '%' ......... left join (select category,hit,COUNT(hit) as hit1 from(Select Category,UpdateTime,due, Case When UpdateTime &l
Select CONVERT(varchar(10),ISNULL(a6.hit1*100,0)/NULLIF(a7.hit0n1, 0))+ '%'
.........
left join
(select category,hit,COUNT(hit) as hit1 from(Select Category,UpdateTime,due,
Case When UpdateTime < Due Then 1 Else 0 End As hit From FeedbackDetail Where StatusName ='Closed' and FeedbackDatetime>=DATEADD(day,-31, GETDATE())) a where hit = 1
Group by category, hit) a6 On a1.Category = a6.Category
left join
(select category,COUNT(hit) as hit0n1 from ( Select Category,UpdateTime,due,
Case when UpdateTime < Due then 1 else 0 end as hit From FeedbackDetail Where StatusName ='Closed' and FeedbackDatetime>=DATEADD(day,-31, GETDATE()) ) a
Group by category)
a7 on a1.Category = a7.Category
但我的代码显示的是:
hit1 hit0n1 percentage
_____ _______ ____________
5 null NULL
6 6 100%
3 10 33.3%
hit0n1中有空值,我想删除空值,同时我想避免0号。要替换空值,那么您想替换什么? 如果要使用与第一列相同的值,则可以使用
ISNULL(hit0n1,hit1)
NULLIF
返回NULL
如果两个表达式相等,则返回表达式一,在您的情况下,表达式一也是NULL
select hit1 = a6.hit1,
hit0n1 = isnull(a7.hit0n1, a6.hit1),
percentage = CONVERT(varchar(10),
ISNULL(a6.hit1 * 100.0,0) / ISNULL(a7.hit0n1, a6.hit1) ) + '%'
如果希望结果保留在小数点后3位
使用convert()
将计算结果转换为十进制(10,3)
,然后再转换为varchar(10)
编辑:更改为处理hit0n1=0
select
hit1,
hit0n1 = isnull(hit0n1, hit1),
percentage = CONVERT(varchar(10),
CONVERT(decimal(10,3),
ISNULL(ISNULL(hit1 * 100.0, 0) / NULLIF(ISNULL(hit0n1, hit1), 0), 0) )
) + '%'
编辑:关于百分比计算的说明
ISNULL(hit0n1,hit1)
返回第一个非null值。如果hit0n1为空,则它将返回hit1值
如果hit0n1为0,则该除法将出错,因为它被0除。要处理它,NULL如果(,0)
用于在
为0时返回NULL值。除法的结果将是空值
最后一个
ISNULL()
是将空值更改为0当您想要过滤某些内容时,可以使用WHERE
或HAVING
。由于拥有
需要聚合,我认为在其中使用会更清晰。由于我们不希望结果中有NULL
值,我们可以使用:
WHERE a6.hit1 IS NOT NULL AND NULLIF(a7.hit0n1, 0) IS NOT NULL
我们只检查0
中的a7。hit0n1
作为0除以某物
是有效的语句
此外,如果您正在处理大量数据,则可以在表上添加索引,不包括NULL
值。尝试以下查询-:
Select hit1,
case when isnull(hit0n1,hit1)!=0 then isnull(hit0n1,hit1) end as [hit0n1],
cast(round((hit1/(case when isnull(hit0n1,hit1)!=0 then isnull(hit0n1,hit1) end)*100),2) as varchar(100))+'%'
from [YOUR_TABLE_NAME]
SQL Server 2014从count、integer中获取的值hit1和hit0n1均为空值。您的意思是hit1也可能为0?您能用这样的示例更新您的问题吗?并展示你希望结果看起来如何。如果你看错了什么,你救了我一天!顺便问一下,你能给我解释一下这行代码“ISNULL(ISNULL(hit1*100.0,0)/NULLIF(ISNULL(hit0n1,hit1),0),0))”因为我对此不是很了解。@kit。更新了答案,我编辑了问题。
WHERE a6.hit1 IS NOT NULL AND NULLIF(a7.hit0n1, 0) IS NOT NULL
Select hit1,
case when isnull(hit0n1,hit1)!=0 then isnull(hit0n1,hit1) end as [hit0n1],
cast(round((hit1/(case when isnull(hit0n1,hit1)!=0 then isnull(hit0n1,hit1) end)*100),2) as varchar(100))+'%'
from [YOUR_TABLE_NAME]