등급 관련 풀리지 않는 문제가 있어서 질문 드립니다.
우선 등급 관리 테이블이 있습니다.
등급 비율
10 5%
9 15%
8 10%
7 10%
6 10%
5 10%
4 10%
3 10%
2 15%
1 5%
만약 인원이 100명이라면
1등부터 5등까지 10등급
6등부터 20등까지 9등급
21등부터 30등까지 8등급
31등부터 40등까지 7등급
41등부터 50등까지 6등급
51등부터 60등까지 5등급
61등부터 70등까지 4등급
71등부터 80등까지 3등급
81등부터 95등까지 2등급
96등부터 100등까지 1등급 으로 매겨져야합니다.
인원의 점수는 랭킹 개념이구요
동일점수에 대해서는
1 100점
1 100점
3 90점
4 80점
5 85점
5 85점
7 70점
으로 생성이 됩니다.
문제는 등급도 10등급으로 정해진게 아니구요
2등급에서 10등급까지 선택하여 옆에 비율도 직접 입력이 가능합니다.
5등급이라고 예를 들면
5등급 20%
4등급 30%
3등급 20%
2등급 20%
1등급 10%
으로 동적으로 가능합니다.
또한가지 문제가. 오라클을 사용하지 않고 sysbase를 사용하고 있습니다.
오라클 함수는 사용이 안될거같습니다.
수식만으로 해결해야 할거같은데 머리고 도무지 돌지가 않네요.
고수님들 답변 부탁드립니다. ㅜㅜ
WITH point_t AS ( SELECT /*+ materialize */ LEVEL pk , ROUND(dbms_random.value(60, 100)) point FROM dual CONNECT BY LEVEL <= 100 ) , code_t AS ( SELECT 10 grd, 5 rat FROM dual UNION ALL SELECT 9, 15 FROM dual UNION ALL SELECT 8, 10 FROM dual UNION ALL SELECT 7, 10 FROM dual UNION ALL SELECT 6, 10 FROM dual UNION ALL SELECT 5, 10 FROM dual UNION ALL SELECT 4, 10 FROM dual UNION ALL SELECT 3, 10 FROM dual UNION ALL SELECT 2, 15 FROM dual UNION ALL SELECT 1, 5 FROM dual ) -- Sybase 환경이 안되어 Oracle 에서 작성 했습니다. -- With 구문은 테스트용 데이터를 생성하기 위한 용도로 실 사용시 제거하시면 되구요. -- ANSI JOIN 구문을 사용했습니다.(Sybase 에서도 작동할것 같습니다.) SELECT * FROM (SELECT b.pk, b.point , COUNT(c.pk) + 1 rk , (COUNT(c.pk) + 1) / a.cnt * 100 AS rat FROM (SELECT COUNT(*) cnt FROM point_t) a CROSS JOIN point_t b LEFT OUTER JOIN point_t c ON b.point < c.point GROUP BY a.cnt, b.pk, b.point ) a INNER JOIN (SELECT a.grd , SUM(CASE WHEN a.grd = b.grd THEN 0 ELSE b.rat END) rat_f , SUM(b.rat) rat_t FROM code_t a INNER JOIN code_t b ON a.grd <= b.grd GROUP BY a.grd ) b ON a.rat > rat_f AND a.rat <= rat_t ORDER BY rk ;