억지로 코드 계층관계 형성하기 0 7 1,936

by 옹네 [2009.03.20 15:55:51]


현재 데이타를 검색하면 (오리지날데이타)

HS SAUP3 MOK
71200 11201000 20600

위의 형식으로 나오는데, (단순 select 문)

 

이것을 조금 변경하여, 아래의 형태로 select. ( substr 이용해서...)

JS GS HS SAUP1 SAUP2 SAUP3 MOK
70000 71000 71200 10000000 11000000 11201000 20600

 

그러나 최종적으로 원하는 형태는 아래와 같거든요.

파란색 부분들 로우를 만들고 싶어요.

노가다성 쿼리 union all (6개 쿼리 반복, substr남발)  로 최종적으로 원하는 형태인 아래 형식처럼은 구했는데,

쿼리가 너무 길어지고, 지저분해서요... 

 union all 을 사용하지 않고 구현할 방법은 없나요?

각 코드별 부모자식 관계는 정의된게 없습니다.

ㅠㅠ

 

JS GS HS SAUP1 SAUP2 SAUP3 MOK
70000            
70000 71000          
70000 71000 71200        
70000 71000 71200 10000000      
70000 71000 71200 10000000 11000000    
70000 71000 71200 10000000 11000000 11201000  
70000 71000 71200 10000000 11000000 11201000 20600

by 웅 [2009.03.20 16:17:43]
with t as (
select 70000 c1, 71000 c2, 71200 c3, 10000000 c4, 11000000 c5, 11201000 c6, 20600 c7 from dual)
select sys_connect_by_path(rslt,' ')
from
(
select rownum rn
, decode(lvl, 1, c1, 2, c2, 3,c3, 4, c4, 5, c5, 6, c6, 7, c7) rslt
from t
, (select level lvl from dual connect by level <= 7)
)
start with rn = 1
connect by prior rn = rn-1

by 옹네 [2009.03.20 16:22:35]
우와~!! 멋쟁이!!! 너무너무 감사해요!!!! 정말 멋져요!!! 속이 뻥~!!! 뚫리네요!!!

by 옹네 [2009.03.20 16:38:50]
ㅠㅠ
그런데 원천데이타 로우가 늘어나면 기하급수적으로 늘어나 버리네요...
ㅠㅠ
원천데이타 로우가 1개일땐 위처럼 나오는게 맞는데요,
로우가 늘어나도 각 로우별 위의 형태를 유지해야 하는데.. 무진장 늘어나요..ㅠㅠ

by 웅 [2009.03.20 16:50:02]
그렇다면 원천데이터에 각 row별 구분컬럼을 을 추가해 주시고 해보셔야죠.

with t as (
select 1 gb, 70000 c1, 71000 c2, 71200 c3, 10000000 c4, 11000000 c5, 11201000 c6, 20600 c7 from dual union all
select 2 gb, 70001 c1, 71001 c2, 71201 c3, 10000001 c4, 11000001 c5, 11201001 c6, 20601 c7 from dual)
select gb, sys_connect_by_path(rslt,' ')
from
(
select lvl rn
, gb
, decode(lvl, 1, c1, 2, c2, 3,c3, 4, c4, 5, c5, 6, c6, 7, c7) rslt
from t
, (select level lvl from dual connect by level <= 7)
)
start with rn = 1
connect by prior rn = rn-1
and prior gb = gb

by 마농 [2009.03.20 17:07:17]
WITH t AS
(
SELECT '71200' hs, '11201000' saup3, '20600' mok FROM dual
UNION ALL SELECT '71300', '11202000', '20700' FROM dual
)
SELECT SUBSTR(hs,1,1)||'0000' js
, CASE WHEN lv >= 2 THEN SUBSTR(hs,1,2)||'000' END gs
, CASE WHEN lv >= 3 THEN hs END hs
, CASE WHEN lv >= 4 THEN SUBSTR(saup3,1,1)||'0000000' END saup1
, CASE WHEN lv >= 5 THEN SUBSTR(saup3,1,2)||'000000' END saup2
, CASE WHEN lv >= 6 THEN saup3 END saup3
, CASE WHEN lv >= 7 THEN mok END mok
FROM t
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 7)
ORDER BY t.hs, t.saup3, t.mok, lv
;

by 웅 [2009.03.20 17:20:09]
오~ 이야기가 또 그렇게 풀리네용...ㅋㅋ
알수없는 데이터라고 치부했는데...

by 옹네 [2009.03.23 09:16:50]
정말정말정말정말 감사합니다...
언제쯤 이런 쿼리들이 내 쿼리가 될랑가... ㅠㅠㅠㅠㅠ 너무 부러워요... 감사해요..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입