가로 출력 0 4 1,372

by dnfrkwhr [2012.11.23 11:00:09]


안녕하세요.  (오라클 10g 사용)
아래와 같이 번호 컬럼
(고정적이지 않고, 불연속)에 숫자가 있습니다.
이 컬럼 값을 세로로 변환 한 후, 연속 된 값이 5개 이상이면 틸드를 사용하고 그렇지 않은 경우는 그 숫자를
있는 그대로 출력하고 싶습니다. 고정적인 숫자가 아니라 값이 많아지면 4개를 기준으로 다음 행으로 내려 
출력을 하고 싶습니다.

회원님들의 조언 좀 구하고자 이렇게 문의를 남깁니다. 감사합니다.


번호               -->      번호       
  1    1~6, 8, 9~14, 15    
  2    16~21, 26~33, 34,35    
  3     ...    
  4
  5
  6
  9
 10
 11
 12
 13
 14
   .
   .
   .
by 마농 [2012.11.23 11:37:03]
-- 예시자료와 결과자료가 일치하지 않네요..임의로 조정해서 해봤습니다.
WITH t AS
(
SELECT LEVEL lv
FROM dual
WHERE LEVEL NOT IN (7, 9, 15, 22, 23, 24, 25, 33, 36)
CONNECT BY LEVEL <= 40
)
SELECT MIN(DECODE(MOD(rn, 4), 1, v)) v1
     , MIN(DECODE(MOD(rn, 4), 2, v)) v2
     , MIN(DECODE(MOD(rn, 4), 3, v)) v3
     , MIN(DECODE(MOD(rn, 4), 0, v)) v4
  FROM (SELECT ROW_NUMBER() OVER(ORDER BY MIN(lv)) rn
             , MIN(lv) || DECODE(COUNT(*), 1, '', '~'||MAX(lv)) v
          FROM (SELECT lv
                     , ROWNUM rn
                     , COUNT(*) OVER(PARTITION BY ROWNUM - lv) cnt
                  FROM (SELECT lv FROM t ORDER BY lv)
                )
         GROUP BY lv - rn
             , CASE WHEN cnt < 5 THEN lv END  
        )
 GROUP BY CEIL(rn / 4)
 ORDER BY CEIL(rn / 4)
;

----------------------------
V1     V2     V3     V4
----------------------------
1~6    8      10~14  16~21
26~32  34     35     37
38     39     40
----------------------------

by 제로 [2012.11.23 13:33:03]
with t as
( select distinct ceil(level+dbms_random.value(1, 5)) no
 from dual connect by level <= 30
)
select wm_concat(val) keep(dense_rank first partition by ceil(rownum/4)) val
from (
   select min(no) no
      , decode(sign(min(no)-max(no)), 0, to_char(min(no)), min(no)||'~'||max(no)) val
   from (select no 
         , no - row_number() over(order by no) val
      from t)
   group by val
   order by no
)
group by ceil(rownum/4)
order by ceil(rownum/4);

by dnfrkwhr [2012.11.23 16:45:53]
마농님, 제로님 답변 너무 갑사힙니다. 덕분에 잘 해결할 수 있었습니다.
다시 한번 감사 드리고, 좋은 하루 보내세요^^

by 서병준 [2012.11.24 12:48:04]
오 디코드 말고 다른방법도 있구나..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입