레벨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 |
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 ;