[英]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: 查询有两个问题:
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)。 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.