NAME | BAN_CNT | NEW_BAN | NEW_BAN_CNT |
강민이 | 1 | C | 1 |
강세리 | 2 | D | 2 |
강혜임 | 3 | E | 3 |
고기쁨 | 4 | F | 4 |
고명서 | 1 | C | 1 |
고유희 | 2 | D | 2 |
고형진 | 3 | E | 3 |
곽은정 | 4 | F | 4 |
위와 같은 데이터가 있습니다. 이 데이터를
NAME | BAN_CNT | NEW_BAN | NEW_BAN_CNT |
강민이 | 1 | C | 1 |
강세리 | 2 | D | 2 |
강혜임 | 3 | E | 3 |
고기쁨 | 4 | F | 4 |
고명서 | 4 | F | 4 |
고유희 | 3 | E | 3 |
고형진 | 2 | D | 2 |
곽은정 | 1 | C | 1 |
이런식으로 만들고 싶은데 고수분들의 조언이 필요합니다. ㅠㅠ
SELECT A.*, B.*
FROM (
SELECT A.NAME
, CASE WHEN MOD(ROW_NUMBER () OVER(ORDER BY A.NAME), 4) = 0 THEN 4 ELSE MOD(ROW_NUMBER () OVER(ORDER BY A.NAME), 4) END AS BAN_CNT
FROM HS_HAKJEOKGIBON_M A
WHERE HAKJEOK_ST = '01'
AND A.HAKGWA_CD = '30020200'
AND A.HAKNYEON = '2'
ORDER BY A.NAME
) A
INNER JOIN (
SELECT CHR(ASCII(UPPER('C'))+LEVEL-1) AS NEW_BAN
,(ASCII(UPPER('C'))+LEVEL-1 - ASCII(UPPER('C'))+LEVEL+1) / 2 AS NEW_BAN_CNT
FROM DUAL CONNECT BY LEVEL <= 4
) B
ON A.BAN_CNT = B.NEW_BAN_CNT
제가 첫번째 보여드린 표의 쿼리는 이러합니다.
-- 돌아갈지 모르겠네요. BAN_CNT 랑 NEW_BAN_CNT 차이가??... SELECT A.NAME, BAN_CNT, CHR(ASCII('B') + BAN_CNT) NEW_BAN, BAN_CNT NEW_BAN_CNT FROM ( SELECT A.*, DECODE(MOD(TRUNC((ROWNUM - 1) / 4), 2), 0, MOD(ROWNUM - 1, 4) + 1, 4 - MOD(ROWNUM - 1, 4)) BAN_CNT FROM ( SELECT NAME FROM HS_HAKJEOKGIBON_M WHERE HAKJEOK_ST = '01' AND HAKGWA_CD = '30020200' AND HAKNYEON = '2' ORDER BY NAME ) A ) A
SELECT name , ban_cnt , CHR(ASCII(c) + ban_cnt - 1) new_ban FROM (SELECT name , DECODE(MOD(CEIL(rn/n),2), 1, MOD(rn-1,n)+1, n-MOD(rn-1,n)) ban_cnt FROM (SELECT name , ROW_NUMBER() OVER(ORDER BY name) rn , 'C' c , 4 n FROM hs_hakjeokgibon_m a WHERE hakjeok_st = '01' AND hakgwa_cd = '30020200' AND haknyeon = '2' ) ) ;