我有一个像以下的mysql表:
样本数据
ID STUDENT_ID Branch_id Class_id Exam_id Subject_id Numbers Date 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 8 222 5 1 1 8 100 2012-01-01 9 222 5 1 1 9 80 2012-01-01 10 222 5 1 1 10 92 2012-01-01 11 222 5 1 1 11 50 2012-01-01 12 222 5 1 1 12 65 2012-01-01 13 222 5 1 1 13 33 2012-01-01 7 222 5 1 1 15 86 2012-01-01
即使两个学生的分数相等,我也需要在课堂上获得学生的等级。例如,如果两名学生在600分中获得600分,则意味着两者都在第一名。
我搜索了很多网站,我发现this post 能够满足我的需求但是在这篇文章中正确的列已经是标记的总和但是在我的表中我需要求和(数字)然后得到学生的等级依赖于总分。
这一切都是我取得单身学生的成绩。
在我为所有课程提取结果时的相同数据有两件事需要。第一行到列数据透视查询以excel格式显示结果,因此我使用row to colum查询,如:
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 Name Math English Science Total Percent Position Rank
我通过此查询得到了结果。但是在同一查询中如何获得学生等级仍然存在排名问题?
任何人都可以帮忙吗?
答案 0 :(得分:1)
My Questin是如何使用SUM(数字)而不是正确的,因为在帖子查询中已经有了正确的答案。
从子查询而不是表中选择。
第二......
我不完全理解你的第二个问题,并没有看到与第一个问题的关系。请写单独的帖子来提出单独的问题。
sum(numbers*(1-abs(sign(subject_id-1))))
你可以把它写成sum(numbers*(subject_id = 1))
,因为在评估像这种比较的布尔运算时,MySQL使用0表示false,1表示true表示。
还有一点需要注意:在性能方面,将WHERE
条件移到子查询m
中会更好。