2012-03-15 148 views
0

我已閱讀其他問題,答案似乎無法解決我的情況。我有一張公司名稱表和一份與這些公司有關的活動表。Count()返回0而不是NULL

我需要計算一個指定日期範圍內的活動量,並返回0,如果有沒有。我還需要獲取最後一次活動的日期(即使它超出指定的日期範圍)。我使用LEFT OUTER JOIN,我試過ISNULL()(雖然,如果它不存在,它怎麼檢查它是否爲空?),我不知道該從哪裏去。

這是我有:

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 

這是最終的答案:(謝謝大家)

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 
+0

,並已顯示'NULL'的'COUNT'當療法是'Company_name'值?還是它確實是文'Company_name'是'NULL' ? – Lamak 2012-03-15 17:59:07

+0

你可以發佈你的表結構嗎? – 2012-03-15 18:00:44

+0

不,不會爲有0個活動的公司返回行。我無法發佈表結構,它們包含敏感的公司數據,對不起。 – 2012-03-15 18:02:38

回答

3

更新:嘗試此操作,首先使用v_rpt_company,因爲您嘗試按公司na進行分組我。

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 
+0

每個公司都會返回0。但是,謝謝你,這是我得到的最接近的。 – 2012-03-15 18:07:05

+0

你可以從每個表格添加模式和2-3行到你的問題 – 2012-03-15 18:08:40

+0

我很難發佈關於表格的很多數據,我處於NDA之下。 – 2012-03-15 18:12:48

0

修改您的count語句,像這樣:

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

沒有骰子。它不顯示0行數公司的行。 – 2012-03-15 18:02:13

+0

哦,我得到你了。 (Company_Team.AcctMgr_Flag = 1)的where子句將導致該外連接在Company_Team中沒有行與連接匹配時不返回記錄。所有其他表的外部都加入到具有where子句的表中。您可以添加一個「OR字段爲空」,使這些連接返回行 – Adam 2012-03-15 18:03:57

+0

檢查我的帖子,當你做了離開外部聯接,然後添加一個where子句條件的表列它不會返回任何空列 – 2012-03-15 18:04:50

0

有兩個問題與您查詢:

  1. 你有WHERE條款來看,這將是錯誤的時候,那裏已經爲這家公司沒有任何活動(因爲從SO_Activity值將是無效的情況下,那麼條件也將爲空)。
  2. 如果上次活動的日期可能超出日期範圍,則需要單獨加入。

這裏是固定的版本:

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 
+0

這將返回所有公司名稱,觸摸總是= 0,並且lasttouch始終爲空。 – 2012-03-15 18:10:52

+0

檢查我更新的查詢 – 2012-03-15 18:13:07