2016-08-11 4 views
0

私はアクセス2013のデータを照会する際に問題に直面しています。コーステーブルからすべてのコース名を表示しようとしましたが、コースユーザーによって提供された2つの日付の間に登録されています。問題は、コーステーブルにあるすべてのコースがクエリに表示されないことです。生徒が登録されているコースのみを表示します。ここに私のSQLは次のとおりです。左に参加してアクセス2013のステートメントとの結合

SELECT Course.Course_name, Count(new_enrolments.Student_code) AS Total,     
Format([Start_date],"mmmm yyyy") AS [Month] 
FROM Course LEFT JOIN new_enrolments ON Course.Course_name = new_enrolments.Course_name 
GROUP BY Course.Course_name, Format([Start_date],"mmmm yyyy"), new_enrolments.Start_date 
HAVING (((new_enrolments.Start_date) Between [Forms]![ParameterForm]![txtBeginDate] And [Forms]![ParameterForm]![txtEndDate])); 
+0

txtBeginDateとtxtEndDateのコントロール値は何ですか?それらを "#"タグで囲む必要があり、おそらくCDateを使用して日付フィールドに変換することもできます。 – dbmitch

+0

txtBeginDateとtxtEndDateの形式はshortDateです。 – user2293224

答えて

1

OUTERがのJOIN(左が参加するか、右に参加する)限り、あなたはあなたの参加外WHERE句を持っていないと正常に動作します。 where句が最初に実行されるため、効果的に外部結合がINNER JOINになります。 解決策は、あなたのJOINにWHERE CLAUSEを移動することです。クエリ以下 は動作するはずです:

SELECT a.Course_name, COUNT(b.Student_code) AS [Total], Format(b.Start_date,"mmmm yyyy") AS [Month] 
FROM Course a 
LEFT JOIN 
(
SELECT b.Course_name, b.Student_code, b.Start_date 
FROM new_enrolments b 
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate] 
) b 
ON a.Course_name=b.Course_name 
GROUP BY a.Course_name, b.Start_date 
; 

代替(下記参照)UNIONを使用することです。 最初のクエリは、登録が存在するすべてのコース名を取得します。 2つめは、登録がないすべてのコース名を取得します。

SELECT a.Course_name, COUNT(b.Student_code) AS [Total], Format(b.Start_date,"mmmm yyyy") AS [Month] 
FROM Course a INNER JOIN new_enrolments b ON a.Course_name=b.Course_name 
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate] 
GROUP BY a.Course_name, b.Start_date 
UNION 
SELECT a.Course_name, NULL, NULL 
FROM Course a 
WHERE a.Course_name NOT IN 
(
SELECT b.Course_name 
FROM new_enrolments b 
WHERE b.Start_date BETWEEN [Forms]![ParameterForm]![txtBeginDate] AND [Forms]![ParameterForm]![txtEndDate] 
) 
関連する問題