2017-09-17 7 views
1

私はいくつかの科目で学生の成績を保持するテーブルを持っています。欠落している行のデフォルトを追加します(学生と科目の組み合わせ)

STUDENT_GRADES

id | studentid | subjectid | grade 
----------------------------------- 
1 | 1  | 1   | A+ 
2 | 1  | 2   | A 
3 | 1  | 3   | A- 
4 | 2  | 2   | A 
5 | 2  | 3   | A- 
6 | 3  | 2   | B 
7 | 4  | 3   | B+ 

と私は対象リストを保持する別のテーブルを持っています。

SUBJECTS

subjectid | subjectname 
----------------------------- 
1   | Maths  
2   | Science 
3   | History 

今、私は次の形式で結果を取得する必要があります。

FORMATTED_GRADES

studentid | subjectid | grade 
----------------------------------- 
1   | 1   | A+ 
1   | 2   | A 
1   | 3   | A- 

2   | 1   | fail 
2   | 2   | A 
2   | 3   | A- 

3   | 1   | fail 
3   | 2   | B 
3   | 3   | fail 

4   | 1   | fail 
4   | 2   | fail 
4   | 3   | B+ 

FORMATTED_GRADESは、各STUDENT_GRADESからの学生と各被験者の彼/彼女のグレードが含まれています。被験者の成績がSTUDENT_GRADESである場合、その被験者の成績は失敗するはずです。

答えて

1

使用cross join行を生成するために、そしてleft joincoalesce()必要なデータを取得するには:

select st.student_id, su.subject_id, 
     coalesce(sg.grade, 'fail') as grade 
from (select distinct student_id from student_grades) st cross join 
    subjects su left join 
    student_grades sg 
    on sg.student_id = st.student_id and sg.subject_id = su.subject_id 
+0

ありがとうございました。それは正常に働いた。 –

2

をあなたはおそらく主キーとしてstudentidで別のテーブルstudentsを持っています。 CROSS JOINで学生と被写体の組み合わせごとに1行との直積を形成することを使用します。

SELECT student_id, subject_id, COALESCE(g.grade, 'fail') AS grade 
FROM  students  t 
CROSS JOIN subjects  u 
LEFT JOIN student_grades g USING (student_id, subject_id); 

最も重要な、これはすべての科目で失敗した学生が含まれています。 student_gradesにエントリがまったくない場合、ユニークな学生をstudent_gradeslike @Gordon demonstrates)から引き抜こうとする試みは、それらを見逃すことになります。

subjectsにはstudent_idという名前の列がなく、studentsには列がありません。subject_idです。そうでない場合は、ショートカットの代わりにとONを使用し、USINGを使用する必要があります。

句を使用して結合する場合、(必然的に同一の)結合列のインスタンスは1つだけ出力テーブルに存在するため、SELECTリストにテーブル修飾は必要ありません。

また、student_grades.gradecharacter data typeであるとします。そうでなければ、互換性のあるデータ型を取得するために明示的にキャストする必要がありますCOALESCE。ようこそ:COALESCE(g.grade::text, 'fail')

+0

ありがとうございました。このアプローチは、より短い実行時間で同じ出力を提供しました。 +1の精緻化。 –

+0

@MilanTitaju:ニース。それはいい答えなのですか? –

関連する問題