Tsql ISNULL(计数(x),0)为null时不返回0

Tsql ISNULL(计数(x),0)为null时不返回0,tsql,coalesce,isnull,Tsql,Coalesce,Isnull,我有以下代码: SELECT FirstName, LastName, (SELECT ISNULL(COUNT(UP1.EmailAddress), 0) AS HasEmail From dbo.UserProfiles AS UP1 WHERE (NOT (UP1.EmailAddress IS NULL)) AND (CreatedBy = dbo.UserProfiles.UserID) GROUP BY CreatedBy) AS Email

我有以下代码:

SELECT     FirstName, LastName,
(SELECT ISNULL(COUNT(UP1.EmailAddress), 0) AS HasEmail 
     From dbo.UserProfiles AS UP1 
     WHERE (NOT (UP1.EmailAddress IS NULL)) AND (CreatedBy = dbo.UserProfiles.UserID)
     GROUP BY CreatedBy) AS EmailEnteredCount FROM dbo.UserProfiles WHERE (IsStaff = 1)
样本结果:

姓氏EmailEnteredCount

票据无效

拉尔森51

克里斯蒂30

帕里什空

塞纳克零

该代码正确执行,但有一个异常,即当未找到记录时返回空值,而不是预期的0。我也尝试过使用coalesce,但没有效果

更新: 这返回了我试图实现的目标,只是需要一个更干净的解决方案。我真的不认为我需要创建一个临时表来替换一个空值

drop table #tt
                    select userid,firstname, lastname, 
                    (
                      SELECT     count(*) AS HasEmail
                      FROM         dbo.UserProfiles AS UP1
                      WHERE     (UP1.EmailAddress IS NOT NULL)AND (UP1.CreatedBy = UserProfiles.UserId) and (datecreated between @startdate and @enddate)
                      GROUP BY CreatedBy
                    ) as EmailCount
                    into #tt
                    from dbo.UserProfiles where isstaff = 1

                    select userid,firstname, lastname, ISNULL(EmailCount,0) As EmailCount from #tt
任何帮助都将不胜感激

谢谢,
克里斯

如果您的isnull在您的计数内,则更有意义。试试这个:

count(isnull(up1.emailaddress, 0))

您需要将isnull函数移到相关子查询之外,如下所示:

SELECT  FirstName, 
        LastName,
        IsNull((
            SELECT  COUNT(UP1.EmailAddress) AS HasEmail 
            From    dbo.UserProfiles AS UP1 
            WHERE   (NOT (UP1.EmailAddress IS NULL)) 
                    AND (CreatedBy = dbo.UserProfiles.UserID)
            GROUP BY CreatedBy), 0) AS EmailEnteredCount 
FROM    dbo.UserProfiles 
WHERE   (IsStaff = 1)

谢谢你的快速回复。我试过了,但它仍然返回空值。我还以为您也在使用NOT UP1筛选空值。虽然我不清楚您为什么不使用is NOT null,而是将NOT放在括号外。我想如果可能的话,你能给我们一些样本数据,比如说5行或者其他什么,这样就有可能看到你在用什么?添加了样本结果数据。“不是”的原因是我已经很久没有使用tsql了,这正是它突然出现在我脑海中的原因。现在,我将更仔细地研究这个查询—为什么不将这两个表连接起来呢?这可能会使它更简单:选择firstname、lastname、countisnullup1.emailaddress,0作为来自dbo.userprofiles的电子邮件作为up1,将dbo.SuperProfiles作为up2加入up1.createdby=up2.userid和up1.emailaddress作为up2,其中up2.isstaff=1-如果我在阅读您的评论后误解了您使用子查询的原因,请纠正我,我回去也这么做了,我认为解决方案也能很好地工作,而且可能在性能方面更好。就像我之前说的,我已经很久没有使用sql了,现在就像再次学习骑马一样。谢谢你的帮助和与我一起工作。谢谢你,现在我明白了,这很有意义。