2013-10-19 64 views
0

我有一個類似於下面顯示的數據庫的學生考試數據的數據庫。我試圖通過將所有科目的MarksSubj)作爲一個學期(Sem)的總和並將其相應地排序來爲這些學生分配ranks通過取得一個colomn的值的總和MySQL訂單表

因此,如果這是原始DB:

Name | S.NO.| Subj | Sem | Marks | Rank 
    ab | B1 | C1 | 1 | 002 | 
    ab | B1 | C2 | 1 | 004 | 
    ab | B1 | C3 | 1 | 005 | 
    ab | B1 | C4 | 2 | 008 | 

    xy | C2 | C1 | 1 | 006 | 
    xy | C2 | C2 | 1 | 004 | 
    xy | C2 | C3 | 2 | 007 | 
    xy | C2 | C4 | 2 | 009 | 
    xy | C2 | C5 | 2 | 003 | 

    sm | Z1 | C1 | 1 | 006 | 
    sm | Z1 | C2 | 2 | 004 | 
    sm | Z1 | C3 | 2 | 008 | 

我想將它轉換成:

Name | S.NO.| Subj | Sem | Marks | Rank 
    ab | B1 | C1 | 1 | 002 | 1(coz his total is 11 in sem 1) 
    ab | B1 | C2 | 1 | 004 | 1 
    ab | B1 | C3 | 1 | 005 | 1 

    ab | B1 | C4 | 2 | 008 | 3 

    xy | C2 | C1 | 1 | 006 | 2 
    xy | C2 | C2 | 1 | 004 | 2 

    xy | C2 | C3 | 2 | 007 | 1(coz his total is 19 in Sem 2) 
    xy | C2 | C4 | 2 | 009 | 1 
    xy | C2 | C5 | 2 | 003 | 1 

    sm | Z1 | C1 | 1 | 006 | 3 

    sm | Z1 | C2 | 2 | 004 | 2 
    sm | Z1 | C3 | 2 | 008 | 2 

該數據庫擁有約30萬行。

+0

自定義RANK OVER在MySQL中很重要,它不會在大型桌面上擴展......您的桌子變得多大? –

+2

爲什麼不用另一張桌子,只有一個學生姓名(或數字),一個學期和一些標記? – Ashalynd

+0

這是一個300-500K行的godaddy帳戶,它真的很難這樣做,因爲它會給我一個連接超時錯誤 – jaisonDavis

回答

1

這是你想要

select name,sno,subj,sem,mark,rank 
from 
(
select e1.* 
     , @sm:=(select sum(e2.mark) from exams e2 where e1.name=e2.name and e1.sem=e2.sem) summark 
     , case when @sem!=sem then @r:=1 
       when @s [email protected] then @r:[email protected]+1 
          else @r 
     end as rank 
     , @s:[email protected] 
     , @sem:=sem 
     from exams e1,(select @r:=0, @s:=0,@sm:=0,@sem:=0) r 
order by sem,summark desc 
) r2  
order by sno,subj; 

我不知道運行什麼。這可能需要一點。

演示在SQL小提琴:http://sqlfiddle.com/#!9/b0290/1

要解釋一下上面。 MySQL不像其他數據庫(例如Oracle)那樣具有分析功能。但上面的模擬它。 @sm是標記的總和。 @r是排名變量。如果標記總和發生變化,則會增加。在學期更改時重置爲1。 @s保存前一行的總和並且@sem保存上一行的學期。

+0

對不起,遲到的評論..javascript被阻止在我的comp..took一段時間,使其工作。 ..關於代碼:AMAZING – jaisonDavis

+0

非常感謝mate ..這就像一個魅力...非常感謝... – jaisonDavis

+0

和時間..它需要一點時間,但是當我創建一個新的與它的表,它只需要一小部分時間。再次感謝一大批 – jaisonDavis