SQL Server列与具有空值的列进行除法

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

我希望我的结果如下所示,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 < 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]