저번주에 Rank 구하는 방법을 마농님이 알려주셔서 개발 했었는데요.
아쉽게도 한가지 더 요건정의가 있었네요.
팀별 등수가 필요해서요.
팀인원은 2명,3명,4명... 달라질 수 있구요.
즉, 팀별 점수는 동일 하구요. 팀별 등수도 동일하게 나와야 되는거죠.
부탁 드립니다.
-------------------------------------------
반 : 이름 : 팀명 : 점수 : 등수
-------------------------------------------
1반 강감찬 A 100 1
1반 차명이 A 100 1
1반 이순신 B 96 2
1반 골동품 B 96 2
1반 홍길동 C 96 2
1반 결사대 C 96 2
1반 김유신 D 90 4
1반 김유신 D 90 4
-------------------------------------------
2반 말똥고리 A 80 1
2반 구리구리 A 80 1
2반 마리마리 A 80 1
2반 장수말벌 B 70 2
2반 벌똥말똥 B 70 2
2반 쉬벌버벌 B 70 2
2반 꿀벌 C 60 3
2반 말벌 C 60 3
2반 쇠벌 C 60 3
2반 나비 D 60 3
2반 너비 D 60 3
2반 고비 D 60 3
-------------------------------------------------------
[이전 답변]- 팀이 빠진 등수구하기
-- 1. Self Join 을 이용하여 등수 구하기 -- http://www.gurubee.net/lecture/2192 SELECT a.gb, a.nm, a.jum , COUNT(b.gb) + 1 rk FROM table a LEFT OUTER JOIN table b ON a.gb = b.gb AND a.jum < b.jum GROUP BY a.gb, a.nm, a.jum ORDER BY gb, rk, nm ; -- 2. 변수를 이용하여 등수 구하기 SELECT gb, nm, jum , @rn := CASE WHEN @gb != gb THEN 1 ELSE @rn + 1 END rn , @rk := CASE WHEN @rn = 1 THEN 1 ELSE CASE WHEN @jum = jum THEN @rk ELSE @rn END END rk , @gb := gb , @jum := jum FROM (SELECT gb, nm, jum FROM table ORDER BY gb, jum DESC, nm) a , (SELECT @gb := '', @jum := 0, @rn := 0, @rk = 0) b ;
마농님이 어제 답변으로 오늘 고생끝에 아래 sql문장을 완성했습니다.
이제 mysql서버에 대해 변수사용방법을 조금 느껴졌네요.
이 느낌으로 mysql이 얼마나 대단한지(?)도 알게 되었구요.
무료라서 싸구려(^^)로 생각했는데 전혀 아니였네요.
변수사용방법만 알고 있으면 정말로 놀라운 sql문장을 만들수도 있네요.
오늘부터 mysql 신봉자가 되렵니다.
SELECT a.game_part_cd, a.enter_team, a.orgn_cd, a.player_seq, a.part_rope_cnt , @rn := CASE WHEN @part != a.game_part_cd THEN 1 ELSE (CASE WHEN @cnt = a.part_rope_cnt THEN @rn + 0 ELSE @rn + 1 + @same END) END rank , @same := CASE WHEN @cnt = a.part_rope_cnt AND (@orgn != a.orgn_cd OR @part != a.game_part_cd OR @team != a.enter_team) THEN @same + 1 ELSE (CASE WHEN @same > 0 AND @cnt = a.part_rope_cnt THEN @same ELSE 0 END) END AS same , @orgn := a.orgn_cd , @part := a.game_part_cd , @team := a.enter_team , @cnt := a.part_rope_cnt FROM (SELECT pl.orgn_cd, a.player_seq, a.game_part_cd, a.part_rope_cnt , a.enter_team FROM hanjul.TPlayerInGame a INNER JOIN hanjul.TPlayer pl ON ( a.contest_yy = pl.contest_yy AND a.contest_seq = pl.contest_seq AND a.player_seq = pl.player_seq ) WHERE a.contest_yy = '2016' AND a.contest_seq = 11 AND a.game_cd = '0080' -- 0080 0010 AND a.part_rope_cnt > 0 ORDER BY a.game_part_cd ASC, a.part_rope_cnt DESC, a.player_seq) a , (SELECT @part := '', @cnt := 0, @rn := 0, @same := 0) b