2011-01-03 3 views
0

今私は、の値のうち、複数の「クラス」のデータに対しての値を返すクエリを持っています。私は何を変更するのか把握しようとしていますので、下のクラスごとにの最新のの値が返されます。は、1つのSQLクエリでさまざまな種類のデータの最新の値を返します。

データそのものは、学生グレードの大きな表です。生徒は複数の成績を持つことができます(pgf.finalgradenameフィールドで取得)。 の学生の場合、生徒の識別子とクラスの識別子で単純に結合するだけで正しいデータが返されます。しかし、私は学生がコースの1つのセクションを落とし、同じコースの別のセクションに登録する状況を説明しようとしています。私の目的のために、最近更新されたグレードが優先レコードを表すと仮定することができます。

以下のフィールドに加えて、レコードが更新された日付を表すpgf.lastgradeupdateフィールドがあります。英語では、私が元に戻すことを望んでいるのは、pgf.lastgradeupdateに基づく最新の行です。このデータを考える:

 
studentid  course_number  finalgradename  percent  lastgradeupdate 
100   M900    H1     70   01-OCT-10 
100   M900    H1     90   20-OCT-10 
100   M900    H2     85   01-JAN-11 
100   M900    H3     88   06-FEB-11 
100   M900    H4     89   07-JUN-11 

私は、クエリが返すようにしたいと思う:

 
studentid  H1  H2  H3  H4 
100   90  85  88  89 

は、ここで私が持っているものです。

select cc.studentid, 
max(case when pgf.finalgradename='H1' then pgf.percent else null end) as H1, 
max(case when pgf.finalgradename='H2' then pgf.percent else null end) as H2, 
max(case when pgf.finalgradename='H3' then pgf.percent else null end) as H3, 
max(case when pgf.finalgradename='H4' then pgf.percent else null end) as H4 
from cc 

left outer join sections sect on abs(cc.sectionid) = sect.id 
left outer join courses on sect.course_number = courses.course_number 
left outer join pgfinalgrades pgf on cc.studentid = pgf.studentid and abs(cc.sectionid) = pgf.sectionid 

where abs(cc.termid) >= 2000 and cc.course_number = 'M900' 
group by cc.studentid 

は、私はそれらのそれぞれについて、サブクエリを作成する必要があります "クラスのデータ?または、私はたくさんの自己結合を行う必要がありますか?私がここで読んだその他の質問は、いくつかではなく、一つの日付しか考慮する必要のない状況に基づいているように見えました。 ありがとう!

答えて

関連する問題