2012-03-15 4 views
0

다른 질문을 읽었으며 답변이 내 상황을 해결하지 못하는 것 같습니다. 나는 회사 이름과 그 회사와 관련된 활동 표를 가지고있다.Count()는 NULL 대신에 0을 반환합니다.

지정된 날짜 범위의 액티비티를 계산해야하며, 액티비티가없는 경우 0을 반환해야합니다. 또한 마지막 활동의 날짜를 가져와야합니다 (지정된 날짜 범위를 벗어나더라도).

을 사용하고 있는데, ISNULL() (비록 존재하지 않으면 null인지 어떻게 확인할 수 있습니까?), 여기서 어디로 가야할 지 모르겠습니다.

내가 무엇을 가지고 :

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

아플리케가 Company_name''의 값이 때'NULL'를 표시하는'COUNT'입니다?, 아니면 총리는'Company_name'는'NULL'입니다 않습니다 ? – Lamak

+0

테이블 구조도 게시 할 수 있습니까? –

+0

아니요, 활동이 0 인 회사는 행이 반환되지 않습니다. 나는 테이블 구조를 게시 할 수 없으며 중요한 회사 데이터가 포함되어 있습니다. 미안합니다. –

답변

3

업데이트 : 회사 na별로 그룹화하려고하기 때문에 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

모든 회사에 대해 0을 반환합니다. 하지만 고마워, 내가 가졌던 가장 가까운 곳이야. –

+0

각 테이블의 스키마와 2-3 행을 질문에 추가 할 수 있습니까? –

+0

테이블에 대한 많은 데이터를 공개하기가 어렵습니다. NDA를 사용하고 있습니다. –

0

가 수정하여 카운트 문 :

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

주사위가 없습니다. 0 카운트를 가진 회사에는 행이 표시되지 않습니다. –

+0

오, 내가 잡았다. Company_Team의 행이 조인과 일치하지 않으면 (Company_Team.AcctMgr_Flag = 1) where 절을 사용하면 외부 조인이 레코드를 반환하지 않게됩니다. 외부에 조인 된 다른 모든 테이블에 대한 DITTO에는 where 절이 있습니다. "OR 필드가 null입니다"추가하여 조인에서 행을 반환하도록 – Adam

+0

외부 조인을 마친 다음 해당 테이블 열에 where 절 조건을 추가하면 내 포스트를 검사하여 null 열을 반환하지 않습니다 –

0

조회 :

  1. 당신은 SO_Activity의 값이 null이 될 것이기 때문에 (즉, 회사의 활동이 없을 때 거짓으로 가고있는 WHERE 절에 조건을 가지고, 조건도 null이됩니다).
  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

이렇게하면 모든 회사 이름이 반환되고 always = 0으로 터치되며 lasttouch는 항상 비어 있습니다. –

+0

내 업데이트 된 쿼리 확인 –

관련 문제