-1

私は次のようなmysqlテーブルを持っています:

サンプルデータ

ID STUDENT_ID Branch_id Class_idExam_idSubject_id番号日付
1 653 5 1 1 8 60 2012-01-01
2 653 5 1 1 9 40 2012-01-01
3 653 5 1 1 10 80 2012-01-01
4 653 5 1 1 11 50 2012-01-01
5 653 5 1 1 12 65 2012-01-01
6 653 5 1 1 13 33 2012-01-01
7 653 5 1 1 15 86 2012-01-01
8222 5 1 1 8100 2012-01-01
9222 5 1 1 9 80 2012-01-01
10222 5 1 1 10 92 2012-01-01
11222 5 1 1 11 50 2012-01-01
12222 5 1 1 12 65 2012-01-01
13222 5 1 1 13 33 2012-01-01
7222 5 1 1 15 86 2012-01-01

2人の生徒の点数が同じでも、クラスの生徒のランクを取得する必要があります。たとえば、2人の生徒が600点満点で600点を獲得した場合、それは両方が1位であることを意味します。

私は多くのサイトを検索し、必要なものが機能するこの投稿を見つけましたが、この投稿では正しい列はすでに点数の合計ですが、私のテーブルでは合計(数)してから学生のランクを取得する必要があります。

これはすべて、私が独身の学生の結果を取得したときです。

すべてのクラスの結果を取得したときの同じデータには、2つのニーズがあります。結果をExcel形式で表示する最初の行から列へのピボットクエリなので、次のように行から列へのクエリを使用します。

SELECT m.* 
FROM (
   select student_id, branch_id, class_id, numbers,  exam_id, date
        , sum(numbers*(1-abs(sign(subject_id-1)))) as subs1
        , sum(numbers*(1-abs(sign(subject_id-2)))) as subs2
        , sum(numbers*(1-abs(sign(subject_id-3)))) as subs3
        , sum(numbers*(1-abs(sign(subject_id-4)))) as subs4
        , sum(numbers*(1-abs(sign(subject_id-5)))) as subs5
        , sum(numbers*(1-abs(sign(subject_id-6)))) as subs6 
   from results 
   GROUP BY student_id, branch_id, class_id,  exam_id
   ) m 
where branch_id = '6' 
 and class_id = '1' 
 and exam_id = '1' 
 and YEAR(date) = '2013' 

必須の結果次のようなクラスクエリで:

ID名数学英語科学合計パーセント位置ランク

そして、私はこのクエリでうまく結果を得ました。しかし、同じクエリで学生のランクを取得する方法にはまだ問題がありますか?

誰か助けてもらえますか?

4

1 に答える 1

1

私の質問は、ポストクエリで正解がすでに合計されているため、正解の代わりにSUM(数値)を使用する方法です。

テーブルの代わりにサブクエリから選択します。

2番目…</p>

私はあなたの2番目の質問を完全には理解しておらず、最初の質問との関係もわかりません。別の質問をするために別の投稿を書いてください。

sum(numbers*(1-abs(sign(subject_id-1))))

sum(numbers*(subject_id = 1))この比較のようなブール演算を評価する場合、MySQLはfalseに0を使用し、trueに1を使用するため、これを記述できます。

もう1つの注意:サブクエリWHEREで条件を移動する方がパフォーマンスの点で優れています。m

于 2013-01-14T07:59:02.557 に答える