-- 일자가 고정되어있다는 전제하에 작성하여 보았습니다. WITH t(dt,nat,city,zone,name,age,seq) AS( SELECT '2017-12-27','대한민국','서울시','강서구','이름1',30,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름2',31,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름3',32,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름4',33,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름5',34,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름6',35,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름7',36,1 FROM DUAL UNION ALL SELECT '2017-12-27','대한민국','서울시','강서구','이름8',37,1 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름1',30,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름2',31,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름3',32,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름4',33,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름5',34,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름6',35,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름7',36,0 FROM DUAL UNION ALL SELECT '2017-11-27','대한민국','서울시','강서구','이름8',37,0 FROM DUAL ) SELECT * FROM ( SELECT dt ,DECODE(gb,'NAT','국가','CITY','도시','ZONE','지역',data) gb ,CASE WHEN gb NOT IN('NAT','CITY','ZONE') THEN TO_CHAR(age) ELSE data END data FROM t UNPIVOT(data FOR gb IN(nat,city,zone,name)) ) PIVOT(MIN(data) FOR dt IN ('2017-11-27','2017-12-27')) ORDER BY INSTR('지역|도시|국가',gb) DESC,gb
WITH RT AS ( SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름1' AS NAME, 30 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름2' AS NAME, 31 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름3' AS NAME, 32 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름4' AS NAME, 33 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름5' AS NAME, 34 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름6' AS NAME, 35 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름7' AS NAME, 36 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름8' AS NAME, 37 AS AGE, 1 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름1' AS NAME, 30 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름2' AS NAME, 31 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름3' AS NAME, 32 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름4' AS NAME, 33 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름5' AS NAME, 34 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름6' AS NAME, 35 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름7' AS NAME, 36 AS AGE, 0 AS NO FROM DUAL UNION ALL SELECT '2017-12-27' AS UDATE, '대한민국' AS NATION, '서울시' AS CITY, '강서구' AS AREA, '이름8' AS NAME, 37 AS AGE, 0 AS NO FROM DUAL ) /****************************************** * 행 -> 열 ******************************************/ SELECT GUBUN , MAX(CASE WHEN NO = 1 AND LV = 5 THEN TO_CHAR(COL_B) WHEN NO = 1 AND LV <> 5 THEN COL_A END) AS COL1 , MAX(CASE WHEN NO = 0 AND LV = 5 THEN TO_CHAR(COL_B) WHEN NO = 0 AND LV <> 5 THEN COL_A END ) AS COL0 FROM (/****************************************** * 열 -> 행 ******************************************/ SELECT A.NO , B.LV , DECODE(B.LV, 5, A.NAME , B.GUBUN) AS GUBUN , DECODE(B.LV, 1, A.UDATE, 2, A.NATION, 3, A.CITY, 4, A.AREA, 5, A.NAME, 6, A.AGE) AS COL_A , DECODE(B.LV, 5, A.AGE , NULL) AS COL_B FROM RT A , (SELECT 1 AS LV, 'UPDATE 일자' AS GUBUN FROM DUAL UNION ALL SELECT 2 AS LV, '국가' AS GUBUN FROM DUAL UNION ALL SELECT 3 AS LV, '도시' AS GUBUN FROM DUAL UNION ALL SELECT 4 AS LV, '지역' AS GUBUN FROM DUAL UNION ALL SELECT 5 AS LV, '이름' AS GUBUN FROM DUAL ) B ) GROUP BY GUBUN, LV ORDER BY LV ;