Count () возвращает 0 вместо NULL - PullRequest
0 голосов
/ 15 марта 2012

Я прочитал другие вопросы, и ответы, похоже, не исправляют мою ситуацию. У меня есть таблица названий компаний и таблица деятельности, связанной с этими компаниями.

Мне нужно посчитать количество действий в указанном диапазоне дат и вернуть 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

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

обновлено: попробуйте это, начните с 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
0 голосов
/ 15 марта 2012

У вас есть две проблемы с запросом:

  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 голосов
/ 15 марта 2012

Измените свое подсчет счета следующим образом:

COALESCE(COUNT(DISTINCT SO_Activity.SO_Activity_Recid),0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...