날짜관련이요! 0 4 750

by 즐라탄빡쳤다 [DB 기타] [2018.07.03 08:54:01]


원본테이블

날짜(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월 표시가 되어야 합니다 부탁드립니다 ㅠㅠㅠ

by 우리집아찌 [2018.07.03 09:05:38]
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

 


by 즐라탄빡쳤다 [2018.07.03 09:09:47]

감사합니다 그런데

SELECT '2018-07-01' , 50 , 20 , 30 FROM DUAL UNION ALL

SELECT '2018-07-02' , 25 , 58 , 22 FROM DUAL

 

이부분 날짜가 7월1일 2일데이터만 있는게 아니라서요 데이터는 그냥 제가 임의로 두개만 넣은건데 어던 날짜에 어떤 데이터가 있을지는 모르는거라 딱 2개만 하드코딩 할순 없어서요 ㅠㅠ 한번만 부탁드리겠습니다 ㅠ


by 우리집아찌 [2018.07.03 09:17:11]

WITH T은 샘플용입니다.

T_MM 만 사용하시면 됩니다.

T 는 실제 테이블을 매칭해주세요.


by 마농 [2018.07.03 09:36:40]

하드코딩을 하라는 의미가 아닙니다.
WITH 문은 테스트 용도로 작성된 것일 뿐입니다.
쿼리 작성 형태를 보시고 그 방법을 이해하셔야 합니다.
 

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
;

 

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