점수테이블에 대해 쿼리 부탁드립니다.
## 점수 테이블
SEQ | 과목 | 점수
1 영어 11
2 영어 12
3 영어 14
4 영어 15
5 영어 30
6 영어 31
7 영어 32
8 영어 35
9 영어 40
10 영어 41
위의 테이블처럼 데이타 숫자가 정해져 있지 않을 경우
예를 들어 영어에 대한 데이타를 가져온다고 가정 할 때
총 데이타의 개수를 가져와서 그룹을 5개그룹으로 할지 10개 그룹으로 할지 정할려고 합니다
데이타가 100개정도 있다고 가정하면 총 5개의 그룹으로 나눌려고 합니다. 하지만 그룹의 점수는 정해져 있지 않으며
현재 들어있는 데이타를 가지고 5등분을 할려고 할때 결과값을 아래와 같이 가져올려고 합니다..
참고로 SEQ 값은 무조건 순차로 진행됩니다. 점수별로 순서가 진행되도록 임시테이블을 쓰기에 어긋나지는 않습니다.
또한 동일 데이타가 존재하지도 않습니다.
## 결과 테이블
과목 | 점수그룹 | 시작범위 | 종료 범위
영어 11~30 11 30
영어 31~80 31 80
영어 84~85 81 85
영어 86~87 86 87
영어 88~99 88 99
이런식으로 상대적으로 그룹을 정해서 나누는 쿼리를 짤려고 하는데
좀 어려워서 조언 좀 구합니다.
99 개의 데이타일 경우 그룹1/2/3/4에는 20명씩, 5에는 19명이 속하도록 처리하고 싶습니다.
조언 부탁드립니다.
점수의 분포가 중복이 없이 다르다면 NTILE 함수를 이용하시면 원하시는 결과를 쉽게 구현가능 합니다.
with res
as (
select 1 seq, '영어' [과목] , 11 [점수] union all
select 2, '영어', 12 union all
select 3, '영어', 14 union all
select 4, '영어', 15 union all
select 5, '영어', 30 union all
select 6, '영어', 31 union all
select 7, '영어', 32 union all
select 8, '영어', 35 union all
select 9, '영어', 40 union all
select 10, '영어', 41
)
select [과목]
, convert(varchar(20), min([점수]) ) + '~' + convert(varchar(20), max([점수]) ) [점수그룹]
, min([점수]) [시작범위]
, max([점수]) [종료범위]
from ( select NTILE (5) over(partition by [과목] order by [점수]) Gubun,[과목],[점수]
from res ) r
group by [과목] , Gubun