예를 들어..한 학년의 성적데이터가 있다고 할때..
1반 모든 학생들의 성적, 2반 학생들의 성적이 쭉~있겠죠.
근데 몇반까지 있는지는 알수 없어요^^;;
이 모든 한 학년의 데이터가 internal table에 담겨 있을 때,
각 반별로, 성적 상위권부터 sorting을 해놓고,
각 반의 상위 10%째에 해당하는 학생을 구할려면 어떻게 해야 할까요?
반이 10개라면 각 반의 상위10%학생의 데이터 총 10개가 만들어지고,
반이 20개라면 총 20건의 데이터가 만들어져야 해요..
에휴..도대체 어떻게 해야 할지 모르겠네요.
도와주세요~ㅠ_ㅠ
제가 생각한 방법은..
data: it_alldata =>전체데이터,
it_temp =>반 번호를 가지고 있는 itab
lv_line =>총라인수
lv_index =>90%째 데이터 줄
1) 전체 itab에서 delete duplicate를 사용하여 몇반까지 있는지 반의 갯수를 정한다.
it_temp = it_alldata
DELETE ADJACENT DUPLICATES FROM it_itab COMPARING ban.
2) 반을 loop 을 돌면서 전체 데이터에서 현재 룹돌고 있는 반을 다른 internal table에 넣는다.
loop at it_temp into wa_temp.
loop at it_alldata into wa_alldata where ban = it_temp-ban.
append wa_alldata to it_ban1.
endloop.
endloop.
3) 반의 갯수만큼 생성된 itab에서 90%째 데이터를 취득한다..
describe table it_ban1 lines lv_line.
lv_line = lv_line * 0.9.
read table it_ban1 index lv_line into wa_ban1.
describe table it_ban1 lines lv_line.
read table it_ban1 index lv_line into wa_ban1.
.
.
.
총 반의 갯수만큼 계속 구한다..ㅠㅠ
=> 이럴때, 각 반마다의 학생 데이터를 넣기 위해 itab을 선언해야 하는데..데이터 선언시에는 몇개의 itab을 만들어야 할지 모른다는 단점이 있습니다..
데이터가 많을 땐 loop 을 계속 돌아서 시간도 엄청 걸릴테구요..
(실제로 몇만껀의 데이터가 될지 모르는 실정입니다ㅠㅠ)
댓글 3
-
jingida
2009.08.03 07:21
-
해보자
2009.08.03 22:12
1) 하기전에 반, 성적으로 정렬하셔야 하구요.
2)에서 각 반별로 loop돌아서 바로 상위 10% 정보 modify하면 되겟네요
loop at it_itab into wa_temp.
l_index = sy-tabix.
it_ban[] = it_alldata[].
delete it_ban where ban <> wa_temp-ban.
3)생성된 it_ban에서 10%에 있는 데이타 취득후 modify
describe table it_ban1 lines lv_line.
lv_line = lv_line * 0.9.
read table it_ban1 index lv_line into wa_ban1.
modify it_ban index l_index.
endloop.
대략 이런 로직? ^^;;
-
멀고도험한
2009.08.04 00:36
감사합니다~^-^*
it_alldata에 모든 데이터가 있다는거네요.
it_alldata에서 반 별로 내림 차순, 성적 별로 오름 차순으로 sorting이 되어있는거구요.
이 테이블에는 학번등으로 학생 관련 디테일한 정보를 매핑시키는 정보들도 있겠죠
반 별 학생 수가 다를 수도 있으니 looping 시 반 번호가 달라지면 학생 수를 구하는 로직을 심으셔야 될거 같습니다.
상위 10%째에 해당하는 학생이라고 하셨으니
학생 수 * 0.1 로 나온 숫자가 반 별 해당 라인이 되겠죠.
해당 라인의 데이터만 모으시면 될거 같습니다.