원본테이블
날짜(YYYY-MM-DD) | 관람객(cnt) | 관람객2(cnt2) | 관람객3(cnt3) |
2018-07-01 | 50 | 20 | 30 |
2018-07-02 | 25 | 58 | 22 |
이걸가지고 출력을 하고싶은데
출력할때 조건은 연도입니다 (YYYY)
일자 | 관람객 | 관람객2 | 관람객3 |
2018-01 | 1월총관람객 | 1월총관람객2 | 1월총관람객3 |
2018-02 | 2월총관람객 | 2월총관람객2 | 2월총관람객3 |
2018-03 | 데이터없으면 0 | 3월총관람객2 | 3월총관람객3 |
2018-04 | |||
2018-05 | |||
2018-06 | |||
2018-07 |
이렇게 출력하는데 년도로 조회시 1월~12월까지출력이 되어야 하는데 데이터가 없으면 0명으로 출력해서 1월~12월 중간에 데이터가 없어도 1월~12월 표시가 되어야 합니다 부탁드립니다 ㅠㅠㅠ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | WITH T (DT , CNT1 , CNT2 , CNT3 ) AS ( SELECT '2018-07-01' , 50 , 20 , 30 FROM DUAL UNION ALL SELECT '2018-07-02' , 25 , 58 , 22 FROM DUAL ) , T_MM (YYYYMM) AS ( SELECT '2018' || '-' || LPAD( LEVEL ,2,0) FROM DUAL CONNECT BY LEVEL <= 12 ) SELECT A.YYYYMM , NVL(B.TOT_CNT1,0) TOT_CNT1 , NVL(B.TOT_CNT2,0) TOT_CNT2 , NVL(B.TOT_CNT3,0) TOT_CNT3 FROM T_MM A , ( SELECT SUBSTR(AA.DT,1,7) YYYYMM , SUM (AA.CNT1) TOT_CNT1 , SUM (AA.CNT2) TOT_CNT2 , SUM (AA.CNT3) TOT_CNT3 FROM T AA WHERE AA.DT LIKE '2018%' GROUP BY SUBSTR(AA.DT,1,7)) B WHERE A.YYYYMM = B.YYYYMM(+) ORDER BY A.YYYYMM |
하드코딩을 하라는 의미가 아닙니다.
WITH 문은 테스트 용도로 작성된 것일 뿐입니다.
쿼리 작성 형태를 보시고 그 방법을 이해하셔야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SELECT a.yyyymm , NVL(b.tot_cnt1, 0) tot_cnt1 , NVL(b.tot_cnt2, 0) tot_cnt2 , NVL(b.tot_cnt3, 0) tot_cnt3 FROM ( SELECT '2018' || '-' || LPAD( LEVEL , 2, '0' ) yyyymm FROM dual CONNECT BY LEVEL <= 12 ) a , ( SELECT SUBSTR(dt, 1, 7) yyyymm , SUM (cnt1) tot_cnt1 , SUM (cnt2) tot_cnt2 , SUM (cnt3) tot_cnt3 FROM t WHERE dt LIKE '2018%' GROUP BY SUBSTR(dt, 1, 7) ) b WHERE a.yyyymm = b.yyyymm(+) ORDER BY yyyymm ; |