2013-01-13 5 views
-1

의 아이디로 순위를 잡아 :피벗 쿼리에서 순위를 확인하고 내가 좋아하는 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 점을 얻으면 두 점 모두 첫 번째 위치에 있음을 의미합니다.

나는 많은 사이트를 검색하고 내가 필요로하는 것이 작동한다는 것을 알았지 만 정확한 칼럼은 이미 표의 합계이지만 내 표에는 합계가 필요하다. .

이 모든 것이 단일 학생의 결과를 가져온 것입니다.

같은 데이터에서 모든 클래스의 결과를 가져올 때 두 가지가 필요합니다. 내가 좋아하는 콜 럼 쿼리에 행을 사용할 수 있도록 엑셀 형식으로 결과를 표시 열 피벗 쿼리에 대한 첫 번째 행 :

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 

그리고 . 그러나 동일한 질문에있는 학생의 계급을 얻는 방법 아직도 순위에있는 문제가 있습니까?

아무도 도와 줄 수 있습니까?

+1

몇 가지 샘플 데이터와 원하는 결과를 게시하십시오. – Quassnoi

+0

Mr. MvG가 귀하의 질문에 답변이 없으므로 질문 순서가 바뀝니다. –

답변

1

My Questin은 게시 쿼리에서 정답이 이미 합산되었으므로 SUM 대신 숫자를 사용하는 방법입니다.

테이블 대신 하위 쿼리에서 선택하십시오. 둘째

...

나는 완전히 두 번째 질문을 이해하지 않고, 첫 번째와의 관계를 볼 수 없습니다. 별도의 질문을하기 위해 별도의 게시물을 작성하십시오.

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

이 비교 같은 부울 연산을 평가할 때 MySQL은 사실에 대한 허위 1에 0을 사용하기 때문에 당신은 sum(numbers*(subject_id = 1))으로 이것을 쓸 수

.

한 가지 더 메모 : WHERE 조건 하위 쿼리 m 내부로 이동하는 것이 성능 측면에서 더 좋습니다.

+0

위의 쿼리로 간단히 순위를 얻을 수 있습니까? –

관련 문제