【问题标题】:ISNULL(Count(x),0) not returning 0 when nullISNULL(Count(x),0) 在 null 时不返回 0
【发布时间】:2014-01-22 18:35:03
【问题描述】:

我有以下代码:

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)

示例结果:

姓氏电子邮件输入计数

账单为空

拉尔森 51

克里斯蒂 30

parrish NULL

senac NULL

代码正确执行,但有一个异常,当没有找到记录时返回空值,而不是预期的 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

任何帮助将不胜感激。

谢谢, 克里斯

【问题讨论】:

    标签: tsql coalesce isnull


    【解决方案1】:

    您需要将 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)
    

    【讨论】:

    • 谢谢你,现在我明白了,这很有意义。
    【解决方案2】:

    如果您的 isnull 在您的计数范围内会更有意义。试试这个:

    count(isnull(up1.emailaddress, 0))
    

    【讨论】:

    • 感谢您的快速回复。我试过了,它仍然返回一个空值。
    • 我认为您也在使用“WHERE (NOT (UP1.EmailAddress IS NULL))”过滤掉空值,但我不清楚您为什么不使用“IS NOT NULL”和而是将 not 放在括号外。我想您是否可以给我们一些示例数据,例如 5 行之类的,以便可以查看您正在处理的内容?
    • 添加了样本结果数据。 “不”是因为我很长时间没有使用 tsql,这就是它突然出现在我脑海中的原因。
    • 好的,我明白了。现在我正在更仔细地查看查询 - 为什么不加入这两个表?这可能会使它更简单:选择 firstname, lastname, count(isnull(up1.emailaddress, 0)) 就像来自 dbo.userprofiles 的电子邮件一样 up1 加入 dbo.uperprofiles as up2 on up1.createdby = up2.userid 和 up1.emailaddress 是not null where up2.isstaff = 1 --如果我误解了您使用子查询的原因,请纠正我
    • 在阅读了您的评论后,我回去也这样做了,我认为解决方案也很有效,而且性能可能更好。就像我之前说的,我已经很久没有使用 sql 了,现在就像再次学习骑马一样。感谢您的帮助并与我合作。
    猜你喜欢
    • 2020-12-22
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多