简体   繁体   English

Count()返回0而不是NULL

[英]Count() return 0 instead of NULL

I have read the other questions and the answers don't seem to fix my situation. 我已经阅读了其他问题,答案似乎并不能解决我的问题。 I have a table of company names and a table of activities associated with those companies. 我有一张公司名称表和与这些公司相关的活动表。

I need to count the amount of activities in a specified date range, and return 0 if there are none. 我需要计算指定日期范围内的活动数量,如果没有,则返回0。 I also need to get the date of the last activity (even if it outside the specified date range). 我还需要获取上一个活动的日期(即使它超出指定的日期范围)。

I am using a LEFT OUTER JOIN , I have tried ISNULL() (although, how can it check if it's null if it doesn't exist?), I'm not sure where to go from here. 我正在使用LEFT OUTER JOIN ,我已经尝试过ISNULL() (尽管,如果不存在它如何检查它是否为null?),我不确定从这里开始。

This is what I have: 这就是我所拥有的:

SELECT       v_rpt_Company.Company_Name, COUNT(DISTINCT SO_Activity.SO_Activity_Recid) as touches, MAX(SO_Activity.Date_Entered) As lasttouch
FROM            v_rpt_Member LEFT OUTER JOIN
                         Company_Team ON v_rpt_Member.Member_RecID = Company_Team.Member_RecID LEFT OUTER JOIN
                         v_rpt_Company ON Company_Team.Company_RecID = v_rpt_Company.Company_RecID LEFT OUTER JOIN
                         SO_Activity ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID
WHERE        (Company_Team.AcctMgr_Flag = 1) AND (v_rpt_Member.Member_ID = @member) AND ((SO_Activity.Last_Update >= CONVERT(datetime, @date_start, 101)) AND ( SO_Activity.Last_Update <= CONVERT(datetime, @date_end, 101))) 
GROUP BY v_rpt_Company.Company_Name
ORDER BY v_rpt_Company.Company_Name ASC,lasttouch DESC,touches DESC

This is the final answer: (Thanks everyone) 这是最终答案:(谢谢大家)

SELECT a.touches, a.name,b.lasttouch

FROM (

 SELECT       v_rpt_Company.Company_Name as name,
COUNT(DISTINCT SO_Activity.SO_Activity_Recid) as touches
FROM   v_rpt_Company  
LEFT OUTER JOIN  Company_Team  ON Company_Team.Company_RecID = v_rpt_Company.Company_RecID AND Company_Team.AcctMgr_Flag = 1
LEFT OUTER JOIN v_rpt_Member ON v_rpt_Member.Member_RecID = Company_Team.Member_RecID  
LEFT OUTER JOIN SO_Activity ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID AND ((SO_Activity.Last_Update >= CONVERT(datetime, @date_start, 101)) AND ( SO_Activity.Last_Update <= CONVERT(datetime, @date_end, 101))) 
WHERE v_rpt_Member.Member_ID = @member
Group By v_rpt_Company.Company_Name ) As a 

LEFT OUTER JOIN

(SELECT MAX(SO_Activity.Date_Entered) As lasttouch, v_rpt_Company.Company_Name as name

FROM   v_rpt_Company  
LEFT OUTER JOIN  Company_Team  ON Company_Team.Company_RecID = v_rpt_Company.Company_RecID AND Company_Team.AcctMgr_Flag = 1
LEFT OUTER JOIN v_rpt_Member ON v_rpt_Member.Member_RecID = Company_Team.Member_RecID
LEFT OUTER JOIN SO_Activity ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID

WHERE v_rpt_Member.Member_ID = @member 

GROUP BY v_rpt_Company.Company_Name) as b 

ON a.name = b.name

updated: Try this, start with v_rpt_company because you are trying to group by company name. 已更新:尝试此操作,从v_rpt_company开始,因为您尝试按公司名称分组。

 SELECT       v_rpt_Company.Company_Name, 
COUNT(DISTINCT SO_Activity.SO_Activity_Recid) as touches, 
MAX(SO_Activity.Date_Entered) As lasttouch
FROM   v_rpt_Company  
LEFT OUTER JOIN  Company_Team  ON Company_Team.Company_RecID = v_rpt_Company.Company_RecID AND Company_Team.AcctMgr_Flag = 1
LEFT OUTER JOIN v_rpt_Member ON v_rpt_Member.Member_RecID = Company_Team.Member_RecID  
LEFT OUTER JOIN SO_Activity ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID AND ((SO_Activity.Last_Update >= CONVERT(datetime, @date_start, 101)) AND ( SO_Activity.Last_Update <= CONVERT(datetime, @date_end, 101))) 
WHERE v_rpt_Member.Member_ID = @member 
GROUP BY v_rpt_Company.Company_Name
ORDER BY v_rpt_Company.Company_Name ASC,lasttouch DESC,touches DESC

像这样修改您的计数语句:

COALESCE(COUNT(DISTINCT SO_Activity.SO_Activity_Recid),0)

There are two problems with you query: 查询有两个问题:

  1. You have conditions in the WHERE clause that are going to be false when there's no activity for that company (since values from SO_Activity will be null, then conditions will be null too). WHERE子句中,当该公司没有任何活动时,条件将为false(因为SO_Activity值将为null,所以条件也将为null)。
  2. If the date of last activity can be outside the date range, you need a separate join for that. 如果上次活动的日期可能不在日期范围内,则您需要一个单独的联接。

Here's the fixed version: 这是固定版本:

SELECT 
v_rpt_Company.Company_Name, 
ISNULL(COUNT(DISTINCT SO_Activity.SO_Activity_Recid), 0) as touches, 
MAX(SO2.Date_Entered) As lasttouch
FROM v_rpt_Member 
LEFT OUTER JOIN Company_Team ON v_rpt_Member.Member_RecID = Company_Team.Member_RecID
LEFT OUTER JOIN v_rpt_Company ON Company_Team.Company_RecID = v_rpt_Company.Company_RecID 
LEFT OUTER JOIN SO_Activity ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID
                      AND SO_Activity.Last_Update >= CONVERT(datetime, @date_start, 101) 
                      AND SO_Activity.Last_Update <= CONVERT(datetime, @date_end, 101)
LEFT OUTER JOIN SO_Activity SO2 ON v_rpt_Company.Company_RecID = SO_Activity.Company_RecID
WHERE Company_Team.AcctMgr_Flag = 1 AND v_rpt_Member.Member_ID = @member
GROUP BY v_rpt_Company.Company_Name
ORDER BY v_rpt_Company.Company_Name ASC,lasttouch DESC,touches DESC

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM