쿼리 질문 드립니다. 0 5 1,488

by InSilence [2014.10.02 10:26:46]


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

 

제가 첫번째 보여드린 표의 쿼리는 이러합니다.

by 백면서생 [2014.10.02 11:16:29]
-- ban_cnt 값이 1,2,3,4,4,3,2,1 순이 되어 조인하면 되겠네요.
-- 아래 sql에서 level에 row_number 를 대입해서 만드시면 될거 같네요.
-- cafe.daum.net/oraclesqltuning 참조

SELECT LEVEL,N + 1 / 2 - ABS (1 + MOD (LEVEL - 1, 2 * N) - (N + 1 / 2)) SEQ
FROM (SELECT 4 N FROM DUAL)
CONNECT BY LEVEL <= 100

 


by InSilence [2014.10.02 11:17:32]

댓글달자마자 답변 올려주셨네요 감사합니다.


by InSilence [2014.10.02 11:17:02]

이것도 자체해결했습니다.


by 비주류 [2014.10.02 11:17:19]
-- 돌아갈지 모르겠네요. 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

 


by 마농 [2014.10.02 12:22:47]
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'
                )
        )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입