계층형 구조 질문드립니다. 1 2 172

by 임마마 [Oracle 기초] [2018.05.15 23:56:35]


레벨1 레벨2 레벨3 데이터1 데이터2
한국 서울 도심 120 10
한국 서울 외각 110 20
한국 부산 도심 100 30
한국 부산 외각 90 40
미국 LA 도심 80 50
미국 LA 외각 70 60
미국 워싱턴 도심 60 70
미국 워싱턴 외각 50 80
중국 베이징 도심 40 90
중국 베이징 외각 30 100
중국 홍콩 도심 20 110
중국 홍콩 외각 10 120

이런식의 데이터를 아래와 같은 방식으로 바꾸고 싶습니다.

어떻게 해야 효율적으로 바꿀수 있을까요? ㅠㅠ

답변해주시면 매우 감사드립니다..

lev tree 레벨1 레벨2 레벨3 데이터1 데이터2
1 한국          
2 서울          
3 도심 한국 서울 도심 120 10
3 외각 한국 서울 외각 110 20
2 부산          
3 도심 한국 부산 도심 100 30
3 외각 한국 부산 외각 90 40
1 미국          
2 LA          
3 도심 미국 LA 도심 80 50
3 외각 미국 LA 외각 70 60
2 워싱턴          
3 도심 미국 워싱턴 도심 60 70
3 외각 미국 워싱턴 외각 50 80
1 중국          
2 베이징          
3 도심 중국 베이징 도심 40 90
3 외각 중국 베이징 외각 30 100
2 홍콩          
3 도심 중국 홍콩 도심 20 110
3 외각 중국 홍콩 외각 10 120

 

 

by 마농 [2018.05.16 09:07:44]
WITH t AS
(
SELECT '한국' lv1, '서울' lv2, '도심' lv3, 120 v1, 10 v2 FROM dual
UNION ALL SELECT '한국', '서울'  , '외각', 110,  20 FROM dual
UNION ALL SELECT '한국', '부산'  , '도심', 100,  30 FROM dual
UNION ALL SELECT '한국', '부산'  , '외각',  90,  40 FROM dual
UNION ALL SELECT '미국', 'LA'    , '도심',  80,  50 FROM dual
UNION ALL SELECT '미국', 'LA'    , '외각',  70,  60 FROM dual
UNION ALL SELECT '미국', '워싱턴', '도심',  60,  70 FROM dual
UNION ALL SELECT '미국', '워싱턴', '외각',  50,  80 FROM dual
UNION ALL SELECT '중국', '베이징', '도심',  40,  90 FROM dual
UNION ALL SELECT '중국', '베이징', '외각',  30, 100 FROM dual
UNION ALL SELECT '중국', '홍콩'  , '도심',  20, 110 FROM dual
UNION ALL SELECT '중국', '홍콩'  , '외각',  10, 120 FROM dual
)
SELECT DECODE(GROUPING_ID(lv2, lv3), 3, 1, 1, 2, 0, 3) lv
     , COALESCE(lv3, lv2, lv1) lv4
     , DECODE(GROUPING(lv3), 0, lv1) lv1
     , DECODE(GROUPING(lv3), 0, lv2) lv2
     , DECODE(GROUPING(lv3), 0, lv3) lv3
     , SUM(v1) v1
     , SUM(v2) v2
  FROM t a
 GROUP BY lv1, ROLLUP(lv2, lv3)
 ORDER BY MIN(ROWNUM)
     , a.lv1
     , a.lv2 NULLS FIRST
     , a.lv3 NULLS FIRST
;

 


by 임마마 [2018.05.16 23:29:36]

정말 감사합니다!

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