BASI_SUST_CD | MNGT_YY | FORMA_SUST_CD | DAYTM_FORMA_RCNT | NGHT_FORMA_RCNT | FORMA_RCNT |
3200100140000 | 2013 | 3200100140000 | 80 | 30 | 110 |
3200100100000 | 2013 | 3200100100000 | 342 | 0 | 342 |
3200100140000 | 2012 | 3200100140000 | 80 | 30 | 110 |
3200100100000 | 2012 | 3200100100000 | 180 | 0 | 180 |
3200100140000 | 2011 | 3200100390000 | 80 | 0 | 80 |
3200100140000 | 2011 | 3200100140000 | 0 | 30 | 30 |
3200100100000 | 2011 | 3200100100000 | 210 | 0 | 210 |
3200100140000 | 2010 | 3200101490000 | 0 | 35 | 35 |
3200100140000 | 2010 | 3200101260000 | 80 | 0 | 80 |
3200100100000 | 2010 | 3200100100000 | 210 | 0 | 210 |
3200100140000 | 2009 | 3200101490000 | 0 | 40 | 40 |
3200100140000 | 2009 | 3200101260000 | 80 | 0 | 80 |
3200100140000 | 2008 | 3200101490000 | 0 | 30 | 30 |
3200100140000 | 2008 | 3200101260000 | 100 | 0 | 100 |
3200100140000 | 2007 | 3200101490000 | 0 | 30 | 30 |
3200100140000 | 2007 | 3200101260000 | 100 | 0 | 100 |
와 같은 데이터가 있습니다.
BASI_SUST_CD | MNGT_YY1 | FORMA_SUST_CD1 | DAYTM_FORMA_RCNT1 | NGHT_FORMA_RCNT1 | FORMA_RCNT1 | MNGT_YY11 | FORMA_SUST_CD11 | DAYTM_FORMA_RCNT11 | NGHT_FORMA_RCNT11 | FORMA_RCNT11 | MNGT_YY111 | FORMA_SUST_CD111 | DAYTM_FORMA_RCNT111 | NGHT_FORMA_RCNT111 | FORMA_RCNT111 | MNGT_YY1111 | FORMA_SUST_CD1111 | DAYTM_FORMA_RCNT1111 | NGHT_FORMA_RCNT1111 | FORMA_RCNT1111 |
3200100140000 | 2013 | 3200100140000 | 80 | 30 | 110 | 2012 | 3200100140000 | 80 | 30 | 110 | 2011 | 3200100390000 | 80 | 0 | 80 | 2010 | 3200101490000 | 0 | 35 | 35 |
3200100140000 | 0 | 30 | 30 | 3200101260000 | 80 | 0 | 80 | |||||||||||||
3200100100000 | 2013 | 3200100100000 | 342 | 0 | 342 | 2012 | 3200100100000 | 180 | 0 | 180 | 2011 | 3200100100000 | 210 | 0 | 210 | 2010 | 3200100100000 | 210 | 0 | 210 |
와 같이 표현 하고 싶습니다.
1. FORMA_SUST_CD가 가변적으로 늘어날수도 줄어 들수도 있음. | ||||||||||||||
2. BASI_SUST_CD를 기준으로 MNGT_YY 를 MNGT_YY1~MNGT_YY1111.... 의 형식으로 표현 | ||||||||||||||
3. MNGT_YY NULL 수도 있음 |
insert into sin values ('3200100140000', '2013', '3200100140000', '80', '30' ,'110');
insert into sin values ('3200100100000', '2013', '3200100100000', '342', '0' ,'342');
insert into sin values ('3200100140000', '2012', '3200100140000', '80', '30' ,'110');
insert into sin values ('3200100100000', '2012', '3200100100000', '180', '0' ,'180');
insert into sin values ('3200100140000', '2011', '3200100390000', '80', '0' ,'80');
insert into sin values ('3200100140000', '2011', '3200100140000', '0', '30' ,'30');
insert into sin values ('3200100100000', '2011', '3200100100000', '210', '0' ,'210');
insert into sin values ('3200100140000', '2010', '3200101490000', '0', '35' ,'35');
insert into sin values ('3200100140000', '2010', '3200101260000', '80', '0' ,'80');
insert into sin values ('3200100100000', '2010', '3200100100000', '210', '0' ,'210');
insert into sin values ('3200100140000', '2009', '3200101490000', '0', '40' ,'40');
insert into sin values ('3200100140000', '2009', '3200101260000', '80', '0' ,'80');
insert into sin values ('3200100140000', '2008', '3200101490000', '0', '30' ,'30');
insert into sin values ('3200100140000', '2008', '3200101260000', '100', '0' ,'100');
insert into sin values ('3200100140000', '2007', '3200101490000', '0', '30' ,'30');
insert into sin values ('3200100140000', '2007', '3200101260000', '100', '0' ,'100');
commit;
--쿼리로는 컬럼갯수를 자동으로 구현할 수 없고요 한 컬럼에 구분자를 이용해서 묶어야 합니다. with t(BASI_SUST_CD, MNGT_YY, FORMA_SUST_CD, DAYTM_FORMA_RCNT, NGHT_FORMA_RCNT, FORMA_RCNT) AS ( SELECT '3200100140000', '2013', '3200100140000', '80', '30' ,'110' FROM dual UNION ALL SELECT '3200100100000', '2013', '3200100100000', '342', '0' ,'342' FROM dual UNION ALL SELECT '3200100140000', '2012', '3200100140000', '80', '30' ,'110' FROM dual UNION ALL SELECT '3200100100000', '2012', '3200100100000', '180', '0' ,'180' FROM dual UNION ALL SELECT '3200100140000', '2011', '3200100390000', '80', '0' ,'80' FROM dual UNION ALL SELECT '3200100140000', '2011', '3200100140000', '0', '30' ,'30' FROM dual UNION ALL SELECT '3200100100000', '2011', '3200100100000', '210', '0' ,'210' FROM dual UNION ALL SELECT '3200100140000', '2010', '3200101490000', '0', '35' ,'35' FROM dual UNION ALL SELECT '3200100140000', '2010', '3200101260000', '80', '0' ,'80' FROM dual UNION ALL SELECT '3200100100000', '2010' , '3200100100000', '210', '0' ,'210' FROM dual UNION ALL SELECT '3200100140000', '2009', '3200101490000', '0', '40' ,'40' FROM dual UNION ALL SELECT '3200100140000', '2009', '3200101260000', '80', '0' ,'80' FROM dual UNION ALL SELECT '3200100140000', '2008', '3200101490000', '0', '30' ,'30' FROM dual UNION ALL SELECT '3200100140000', '2008', '3200101260000', '100', '0' ,'100' FROM dual UNION ALL SELECT '3200100140000', '2007', '3200101490000', '0', '30' ,'30' FROM dual UNION ALL SELECT '3200100140000', '2007', '3200101260000', '100', '0' ,'100' FROM dual) SELECT DECODE(lv, 1, BASI_SUST_CD, ' ') , listagg(NVL2(FORMA_SUST_CD, lpad(NVL(mngt_yy,' '),4), ' ') ||'|'||LPAD(NVL(FORMA_SUST_CD,' '), 13) ||'|'||LPAD(NVL(DAYTM_FORMA_RCNT,' '), 3) ||'|'||LPAD(NVL(NGHT_FORMA_RCNT, ' '), 3) ||'|'||LPAD(NVL(FORMA_RCNT,' '), 3), '▦') WITHIN GROUP(ORDER BY mngt_yy DESC NULLS LAST) FROM (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= (SELECT MAX(COUNT(1)) FROM t GROUP BY BASI_SUST_CD, MNGT_YY)) tt1 LEFT OUTER JOIN (SELECT BASI_SUST_CD, t1.MNGT_YY, FORMA_SUST_CD, DAYTM_FORMA_RCNT, NGHT_FORMA_RCNT, FORMA_RCNT , row_number() OVER (PARTITION BY BASI_SUST_CD, t1.MNGT_YY ORDER BY FORMA_SUST_CD DESC) rn FROM (SELECT DISTINCT mngt_yy FROM t) t1 LEFT OUTER JOIN t t2 PARTITION BY (t2.BASI_SUST_CD) ON t1.mngt_yy = t2.mngt_yy ) tt2 PARTITION BY (tt2.BASI_SUST_CD, tt2.MNGT_YY) ON tt1.lv = tt2.rn GROUP BY BASI_SUST_CD, lv ORDER BY BASI_SUST_CD DESC ;
또 허접한 답올라갑니다 ㅡㅡ 4년치입니다. 나머지는 추가하세요
with
t(BASI_SUST_CD, MNGT_YY, FORMA_SUST_CD, DAYTM_FORMA_RCNT, NGHT_FORMA_RCNT, FORMA_RCNT) AS (
SELECT '3200100140000', '2013', '3200100140000', '80', '30' ,'110' FROM dual UNION ALL
SELECT '3200100100000', '2013', '3200100100000', '342', '0' ,'342' FROM dual UNION ALL
SELECT '3200100140000', '2012', '3200100140000', '80', '30' ,'110' FROM dual UNION ALL
SELECT '3200100100000', '2012', '3200100100000', '180', '0' ,'180' FROM dual UNION ALL
SELECT '3200100140000', '2011', '3200100390000', '80', '0' ,'80' FROM dual UNION ALL
SELECT '3200100140000', '2011', '3200100140000', '0', '30' ,'30' FROM dual UNION ALL
SELECT '3200100100000', '2011', '3200100100000', '210', '0' ,'210' FROM dual UNION ALL
SELECT '3200100140000', '2010', '3200101490000', '0', '35' ,'35' FROM dual UNION ALL
SELECT '3200100140000', '2010', '3200101260000', '80', '0' ,'80' FROM dual UNION ALL
SELECT '3200100100000', '2010' , '3200100100000', '210', '0' ,'210' FROM dual UNION ALL
SELECT '3200100140000', '2009', '3200101490000', '0', '40' ,'40' FROM dual UNION ALL
SELECT '3200100140000', '2009', '3200101260000', '80', '0' ,'80' FROM dual UNION ALL
SELECT '3200100140000', '2008', '3200101490000', '0', '30' ,'30' FROM dual UNION ALL
SELECT '3200100140000', '2008', '3200101260000', '100', '0' ,'100' FROM dual UNION ALL
SELECT '3200100140000', '2007', '3200101490000', '0', '30' ,'30' FROM dual UNION ALL
SELECT '3200100140000', '2007', '3200101260000', '100', '0' ,'100' FROM dual)
SELECT
BASI_SUST_CD , NUM
, MAX(MNGT_YY), MAX(FORMA_SUST_CD) , MAX(DAYTM_FORMA_RCNT) , MAX(NGHT_FORMA_RCNT) , MAX(FORMA_RCNT)
, MAX(MNGT_YY_1), MAX(FORMA_SUST_CD_1) , MAX(DAYTM_FORMA_RCNT_1) , MAX(NGHT_FORMA_RCNT_1) , MAX(FORMA_RCNT_1)
, MAX(MNGT_YY_2), MAX(FORMA_SUST_CD_2) , MAX(DAYTM_FORMA_RCNT_2) , MAX(NGHT_FORMA_RCNT_2) , MAX(FORMA_RCNT_2)
, MAX(MNGT_YY_3), MAX(FORMA_SUST_CD_3) , MAX(DAYTM_FORMA_RCNT_3) , MAX(NGHT_FORMA_RCNT_3) , MAX(FORMA_RCNT_3)
FROM
(SELECT T.BASI_SUST_CD
,ROW_NUMBER() OVER(PARTITION BY BASI_SUST_CD , MNGT_YY ORDER BY NULL ) NUM
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY') , MNGT_YY) MNGT_YY
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY') , FORMA_SUST_CD) FORMA_SUST_CD
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY') , DAYTM_FORMA_RCNT) DAYTM_FORMA_RCNT
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY') , NGHT_FORMA_RCNT ) NGHT_FORMA_RCNT
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY') , FORMA_RCNT ) FORMA_RCNT
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-1 , MNGT_YY) MNGT_YY_1
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-1 , FORMA_SUST_CD) FORMA_SUST_CD_1
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-1 , DAYTM_FORMA_RCNT) DAYTM_FORMA_RCNT_1
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-1 , NGHT_FORMA_RCNT ) NGHT_FORMA_RCNT_1
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-1 , FORMA_RCNT ) FORMA_RCNT_1
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-2 , MNGT_YY) MNGT_YY_2
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-2 , FORMA_SUST_CD) FORMA_SUST_CD_2
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-2 , DAYTM_FORMA_RCNT) DAYTM_FORMA_RCNT_2
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-2 , NGHT_FORMA_RCNT ) NGHT_FORMA_RCNT_2
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-2 , FORMA_RCNT ) FORMA_RCNT_2
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-3 , MNGT_YY) MNGT_YY_3
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-3 , FORMA_SUST_CD) FORMA_SUST_CD_3
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-3 , DAYTM_FORMA_RCNT) DAYTM_FORMA_RCNT_3
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-3 , NGHT_FORMA_RCNT ) NGHT_FORMA_RCNT_3
,DECODE(MNGT_YY,TO_CHAR(SYSDATE ,'YYYY')-3 , FORMA_RCNT ) FORMA_RCNT_3
FROM T
) B
GROUP BY BASI_SUST_CD , NUM
SELECT BASI_SUST_CD ,MAX(DECODE(COL_NO, 1, MNGT_YY)) MNGT_YY_1 ,MAX(DECODE(COL_NO, 1, FORMA_SUST_CD)) FORMA_SUST_CD_1 ,MAX(DECODE(COL_NO, 1, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_1 ,MAX(DECODE(COL_NO, 1, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_1 ,MAX(DECODE(COL_NO, 1, FORMA_RCNT)) FORMA_RCNT_1 ,MAX(DECODE(COL_NO, 2, MNGT_YY)) MNGT_YY_2 ,MAX(DECODE(COL_NO, 2, FORMA_SUST_CD)) FORMA_SUST_CD_2 ,MAX(DECODE(COL_NO, 2, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_2 ,MAX(DECODE(COL_NO, 2, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_2 ,MAX(DECODE(COL_NO, 2, FORMA_RCNT)) FORMA_RCNT_2 ,MAX(DECODE(COL_NO, 3, MNGT_YY)) MNGT_YY_3 ,MAX(DECODE(COL_NO, 3, FORMA_SUST_CD)) FORMA_SUST_CD_3 ,MAX(DECODE(COL_NO, 3, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_3 ,MAX(DECODE(COL_NO, 3, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_3 ,MAX(DECODE(COL_NO, 3, FORMA_RCNT)) FORMA_RCNT_3 ,MAX(DECODE(COL_NO, 4, MNGT_YY)) MNGT_YY_4 ,MAX(DECODE(COL_NO, 4, FORMA_SUST_CD)) FORMA_SUST_CD_4 ,MAX(DECODE(COL_NO, 4, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_4 ,MAX(DECODE(COL_NO, 4, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_4 ,MAX(DECODE(COL_NO, 4, FORMA_RCNT)) FORMA_RCNT_4 ,MAX(DECODE(COL_NO, 5, MNGT_YY)) MNGT_YY_5 ,MAX(DECODE(COL_NO, 5, FORMA_SUST_CD)) FORMA_SUST_CD_5 ,MAX(DECODE(COL_NO, 5, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_5 ,MAX(DECODE(COL_NO, 5, NGHT_FORMA_RCNT)) GHT_FORMA_RCNT_5 ,MAX(DECODE(COL_NO, 5, FORMA_RCNT)) FORMA_RCNT_5 ,MAX(DECODE(COL_NO, 6, MNGT_YY)) MNGT_YY_6 ,MAX(DECODE(COL_NO, 6, FORMA_SUST_CD)) FORMA_SUST_CD_6 ,MAX(DECODE(COL_NO, 6, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_6 ,MAX(DECODE(COL_NO, 6, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_6 ,MAX(DECODE(COL_NO, 6, FORMA_RCNT)) FORMA_RCNT_6 ,MAX(DECODE(COL_NO, 7, MNGT_YY)) MNGT_YY_7 ,MAX(DECODE(COL_NO, 7, FORMA_SUST_CD)) FORMA_SUST_CD_7 ,MAX(DECODE(COL_NO, 7, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_7 ,MAX(DECODE(COL_NO, 7, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_7 ,MAX(DECODE(COL_NO, 7, FORMA_RCNT)) FORMA_RCNT_7 ,MAX(DECODE(COL_NO, 8, MNGT_YY)) MNGT_YY_8 ,MAX(DECODE(COL_NO, 8, FORMA_SUST_CD)) FORMA_SUST_CD_8 ,MAX(DECODE(COL_NO, 8, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_8 ,MAX(DECODE(COL_NO, 8, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_8 ,MAX(DECODE(COL_NO, 8, FORMA_RCNT)) FORMA_RCNT_8 ,MAX(DECODE(COL_NO, 9, MNGT_YY)) MNGT_YY_9 ,MAX(DECODE(COL_NO, 9, FORMA_SUST_CD)) FORMA_SUST_CD_9 ,MAX(DECODE(COL_NO, 9, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_9 ,MAX(DECODE(COL_NO, 9, NGHT_FORMA_RCNT)) NGHT_FORMA_RCNT_9 ,MAX(DECODE(COL_NO, 9, FORMA_RCNT)) FORMA_RCNT_9 ,MAX(DECODE(COL_NO,10, MNGT_YY)) MNGT_YY_10 ,MAX(DECODE(COL_NO,10, FORMA_SUST_CD)) FORMA_SUST_CD_10 ,MAX(DECODE(COL_NO,10, DAYTM_FORMA_RCNT)) DAYTM_FORMA_RCNT_10 ,MAX(DECODE(COL_NO,10, NGHT_FORMA_RCNT)) GHT_FORMA_RCNT_10 ,MAX(DECODE(COL_NO,10, FORMA_RCNT)) FORMA_RCNT_10 FROM ( SELECT T.* ,ROW_NUMBER() OVER(PARTITION BY BASI_SUST_CD ,MNGT_YY ORDER BY FORMA_SUST_CD ) ROW_SEQ ,TO_NUMBER(TO_CHAR(SYSDATE ,'YYYY')) - TO_NUMBER(MNGT_YY) + 1 COL_NO FROM T WHERE MNGT_YY >= TO_CHAR(TO_NUMBER(TO_CHAR(SYSDATE ,'YYYY')) - 9) AND MNGT_YY <= TO_CHAR(SYSDATE ,'YYYY') ) GROUP BY BASI_SUST_CD ,ROW_SEQ ORDER BY BASI_SUST_CD ,ROW_SEQ