2012-03-15 13 views
0

私は他の質問を読んでおり、答えは自分の状況を修正してくれないようです。私は会社名の表とその会社に関連する活動の表を持っています。Count()はNULLの代わりに0を返します。

指定した日付範囲内のアクティビティの数をカウントし、存在しない場合は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

そしてTHERがCompany_name' 'の値があるときに' NULL'を表示する 'COUNT'ある?またはそれは温首相は' Company_name'は 'NULL'でないこと? – Lamak

+0

テーブル構造も転記できますか? –

+0

いいえ、アクティビティが0の企業では行は返されません。私はテーブル構造を投稿することはできません。彼らは機密データを含んでいます。 –

答えて

3

を更新されました:これを試してください、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句は、その外部結合がレコードを返さないようにします。外部に結合されている他のすべての表には、where句があるため、同上。これらの結合が行を返すようにするには、「ORフィールドはnullです」を追加することができます。 – Adam

+0

外部結合を残してwhere句条件をそのテーブル列に追加すると、NULL列は返されません。 –

0

照会:

  1. あなたはSO_Activityからの値がnullになりますので、(その会社のための活動がないときはfalseになるだろう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

これはすべての会社名を返し、常に0をタッチし、lasttouchは常に空白です。 –

+0

更新されたクエリを確認する –

関連する問題