使用COUNT函数与LEFT JOIN结合WHERE子句时,如何在过滤日期的同时返回含NULL计数的所有行
解决左连接后过滤日期仍保留无匹配记录的问题
这是个典型的左连接过滤条件放错位置导致的问题!你的WHERE子句b.date>'2022-07-31'把左连接变成了隐式内连接——因为左连接后,那些在Prod.CAPTURE_DETAILS里没有匹配记录的代理,b.date会是NULL,而NULL和任何值比较都不会返回真,所以这些行被直接过滤掉了。
要实现你的需求,有两种常用方案:
方案1:把日期过滤条件移到LEFT JOIN的ON子句中
这是最规范的做法,因为左连接的关联条件和过滤条件应该一起放在ON里,这样连接时就只匹配符合日期的记录,同时保留所有Prod.Employee的行:
Select count(b.confirm_cd) cd_Instances, A.EID, A.Firstname, A.LastName, b.Agent_Login, A.AgentOrg from Prod.Employee A left outer join Prod.CAPTURE_DETAILS b on a.AgentID = b.Agent_ID and b.date > '2022-07-31' -- 把日期条件移到这里 group by A.EID, A.Firstname, A.LastName, b.Agent_Login, A.AgentOrg order by cd_Instances asc
方案2:在WHERE子句中兼容NULL的情况
如果你一定要把条件放在WHERE里,需要加上b.date IS NULL的判断,这样既保留符合日期的匹配记录,也保留没有匹配的代理:
Select count(b.confirm_cd) cd_Instances, A.EID, A.Firstname, A.LastName, b.Agent_Login, A.AgentOrg from Prod.Employee A left outer join Prod.CAPTURE_DETAILS b on a.AgentID = b.Agent_ID Where b.date > '2022-07-31' OR b.date IS NULL -- 加上OR条件兼容NULL group by A.EID, A.Firstname, A.LastName, b.Agent_Login, A.AgentOrg order by cd_Instances asc
两种方案都能让你得到所有代理的信息:有符合日期记录的显示对应计数,没有的cd_Instances会是0(因为count(b.confirm_cd)对NULL计数为0)。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

