cursor loop문에서 case문을 사용할 수 있나요?? 0 5 1,113

by 빳데리빵빵 [2015.05.15 00:44:51]


소스테이블의 value값을 이용하여 loop문을 사용해야 합니다.

source ex)  name         set

                  a01            103

 

이렇게 소스 테이블에 들어 있을경우

case when set > 100 then

          select '100','100이상',100 as value  into value1, value2,value3

        when set > 50 then

          select '50','50이상',50 into value1, value2,value3

        when set > 1 then

          select '1','1이상',1 into value1, value2,value3

   end case;

set = set - value 

이런식으로 해서 소스는 한개의 row인데 타겟에 적재되는 값은 여러 row가 되도록 cursor문을 구현해야 하는데 아무리 해봐도 case loop문이 잘 안되네요

target ex)  name     set        value

                a01       100        100이상

                a01         1            1이상

고수님들의 도움을 부탁드려요 ^^*

 

by 마농 [2015.05.15 09:33:15]

103 이면 결과가 4건이 나와야 하는 것 아닌가요? (100, 1, 1, 1)
252 라면 (100, 100, 50, 1, 1) 5행이 나오는 거 맞나요?


by 빳데리빵빵 [2015.05.15 11:02:01]

네 맞습니다 급하게 질문을 드리다보니 그렇게 되었네요 ^^;;


by 마농 [2015.05.15 11:12:05]
WITH t AS
(
SELECT 'a01' cd, 103 v FROM dual
)
SELECT cd, v
     , CASE WHEN LEVEL <= v1      THEN 100
            WHEN LEVEL <= v1 + v2 THEN  50
            ELSE 1 END x
     , CASE WHEN LEVEL <= v1      THEN '100이상'
            WHEN LEVEL <= v1 + v2 THEN  '50이상'
            ELSE '1이상' END y
  FROM (SELECT cd, v
             , FLOOR(v / 100) v1
             , FLOOR(MOD(v, 100) / 50) v2
             , MOD(v, 50) v3
          FROM t
        )
 CONNECT BY LEVEL <= v1 + v2 + v3
;

 


by 빳데리빵빵 [2015.05.15 12:02:39]

마농님 답변 감사드려요  ^^*

저건 예제라 한 row만 한거고 소스에서 여러 row를 반환해서 cursor문에서 사용하려고 하거든요 ^^;


by 마농 [2015.05.15 13:07:03]
WITH t AS
(
SELECT 'a01' cd, 103 v FROM dual
UNION ALL SELECT 'a02', 252 FROM dual
)
SELECT cd, v
     , CASE WHEN lv <= v1      THEN 100
            WHEN lv <= v1 + v2 THEN  50
            ELSE 1 END x
     , CASE WHEN lv <= v1      THEN '100이상'
            WHEN lv <= v1 + v2 THEN  '50이상'
            ELSE '1이상' END y
  FROM (SELECT cd, v
             , FLOOR(v / 100) v1
             , FLOOR(MOD(v, 100) / 50) v2
             , MOD(v, 50) v3
          FROM t
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= v1 + v2 + v3
 ORDER BY cd, lv
;

 

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