2016-05-12 6 views
0

Iグレードの異なる種類をしましたし、使用して自分のマークに応じてそれらをランクSQL /ランクを使用して、テーブル内の文字/ DENSE_RANK()に応じてランキング

select id,subject,semester,student,course,mark,grade 
,dense_rank() over(PARTITION by course order by mark desc) as RANK 
from courses c 
LEFT JOIN course_enrolments b ON c.id=b.course; 

を、結果は次のとおりです。

id subject semester student course mark grade rank 
5270 1001 126 1077055 5270 99  HD 1 
5270 1001 126 1076079 5270 98  HD 2 
5270 1001 126 1077334 5270 85  HD 3 
5270 1001 126 1076920 5270 84  DN 4 
5270 1001 126 1077443 5270 84  DN 5 
5270 1001 126 1072135 5270 67  CR 6 
5270 1001 126 1079997 5270 66  CR 7 
5270 1001 126 1071034 5270 62  PS 8 
5270 1001 126 1079993 5270 62  PS 9 
5270 1001 126 1074070 5270 44  FL 10 
5270 1001 126 1078409 5270 30  FL 11 
5270 1001 126 1073006 5270 28  FL 12 

しかし、私は何を達成しようとしていることは彼らのマーク応じてその学年に応じてこれらの人々をランク付けしていない:

だから私は何を達成しようとしていることは、このようなものです:

id subject semester student course mark grade rank 
5270 1001 126 1077055 5270 99  HD 1 
5270 1001 126 1076079 5270 98  HD 1 
5270 1001 126 1077334 5270 85  HD 1 
5270 1001 126 1076920 5270 84  DN 2 
5270 1001 126 1077443 5270 84  DN 2 
5270 1001 126 1072135 5270 67  CR 3 
5270 1001 126 1079997 5270 66  CR 3 
5270 1001 126 1071034 5270 62  PS 4 
5270 1001 126 1079993 5270 62  PS 4 
5270 1001 126 1074070 5270 44  FL 5 
5270 1001 126 1078409 5270 30  FL 5 
5270 1001 126 1073006 5270 28  FL 5 

がどのように私はこれを実現することができますか? ありがとう、

+0

をHDs(2列)に追加し、そのテーブルを「グレード」フィールドの最初のテーブルに追加するだけです。私はそれを書こうとしますが、私はPostgreSQLの構文に慣れていません。 – Sturgus

答えて

0

役立つ場合は、SQL Serverで次のように使用します。おそらくあなた(または誰か)はそれを翻訳できますか?

DECLARE @GradeRankTVP Table (
    Grade Varchar(2), 
    GradeRank int 
); 
INSERT INTO @GradeRankTVP (Grade, GradeRank) VALUES 
    (HD, 1) 
    ,(DN, 2) 
    ,(CR, 3) 
    ,(PS, 4) 
    ,(FL, 5) 
-- ,etc 
; 
select c.id, c.subject, c.semester, b.student, c.course, b.mark, b.grade 
, d.GradeRank 
from courses c 
LEFT JOIN course_enrolments b ON c.id = b.course 
LEFT JOIN @GradeRankTVP AS d on b.grade = d.Grade 
1

は、OracleとSQL Serverで動作しているこれを行うことができる必要があります:私はこれを行うための最も簡単な方法は、あなたが手動でランクを割り当てるテーブル値パラメータを作成することだと思う

select id,subject,semester,student,course,mark,grade, 
case when grade = 'HD' then 1 
    when grade = 'DN' then 2 
    when grade = 'CR' then 3 
    when grade = 'PS' then 4 
    when grade = 'FL' then 5 
end as RANK 
from courses c 
order by mark desc 
+1

またはその場合は、直接、 'grad ... then 5 end as rank'、つまりdense_rank()は無意味になります。 –

+1

真であり、必要がないときには使用しないことをお勧めします。上記の編集、ありがとう! – mo2

関連する問題