주간 통계 쿼리 작성 질문 드립니다. 0 1 2,897

by 고목나무 [SQL Query] 주간통계 SQL [2017.06.14 00:41:54]


안녕하세요

주간 및 월간 통계 조회 쿼리 작성 질문 드립니다.

먼저 주간 통계 데이터를 조회 하기 위해서 입력으로 2017-06와 같은 문자열을 입력 받아 해당 달에 대하여

 1~5주차별 각 행의 상태 컬럼 값에 따라 카운트를 구하여 차트로 보여줄려고 합니다. 

예로 2017-06 문자열을 입력 받으면 

1일 ~ 3일    : 1(주차)

4일 ~ 10일  : 2(주차)

......

25일 ~ 30일  : 5(주차)

 

에 대하여 아래와 같은 결과를 얻기 위해서는 어떻게 쿼리를 짜야 하는지 문의드립니다.

결과 값을 보시면 2주차에 01코드값에 대한 데이터가 없으므로 0으로 나오게 되어 있습니다. 이와 같은 결과값을 얻고 싶습니다...

 

테이블 구조는 

시퀀스(NUMBER) | 등록일(DATE) | 상태값(VARCHAR) | 기타값 

이와 같은 구조입니다.

 

혹시 2016와 같은 연도 문자열을 입력 받아 해당 연의 월 단위 아래 결과 값과 유사한 쿼리 작성 방법도 가능하시면 문의드립니다.

고맙습니다.

 

번호 월기준주차(1~5) 상태값 카운트
1 1 00 2
2 1 01 3
3 1 02 2
4 2 00 1
5 2 01 0
6 2 02 5
7 3 00 0
8 3 01 1
9 3 02 4

 

by 마농 [2017.06.14 10:43:47]
WITH t AS
(
SELECT TO_DATE('20170601', 'yyyymmdd') dt, '00' st FROM dual
UNION ALL SELECT TO_DATE('20170601', 'yyyymmdd'), '01' FROM dual
UNION ALL SELECT TO_DATE('20170601', 'yyyymmdd'), '02' FROM dual
UNION ALL SELECT TO_DATE('20170605', 'yyyymmdd'), '00' FROM dual
UNION ALL SELECT TO_DATE('20170606', 'yyyymmdd'), '02' FROM dual
UNION ALL SELECT TO_DATE('20170607', 'yyyymmdd'), '02' FROM dual
UNION ALL SELECT TO_DATE('20170612', 'yyyymmdd'), '01' FROM dual
UNION ALL SELECT TO_DATE('20170613', 'yyyymmdd'), '01' FROM dual
UNION ALL SELECT TO_DATE('20170614', 'yyyymmdd'), '02' FROM dual
)
, st_cd AS
(
SELECT '00' st FROM dual
UNION ALL SELECT '01' FROM dual
UNION ALL SELECT '02' FROM dual
)
SELECT b.w
     , a.st
     , NVL(b.cnt, 0) cnt
  FROM st_cd a
  LEFT OUTER JOIN
       (SELECT (TRUNC(dt, 'd') - TRUNC(TRUNC(dt, 'mm'), 'd')) / 7 + 1 w
             , st
             , COUNT(*) cnt
          FROM t
         WHERE dt >= TO_DATE('2017-06', 'yyyy-mm')
           AND dt <  ADD_MONTHS(TO_DATE('2017-06', 'yyyy-mm'), 1)
         GROUP BY (TRUNC(dt, 'd') - TRUNC(TRUNC(dt, 'mm'), 'd')) / 7 + 1, st
        ) b
 PARTITION BY (b.w)
    ON a.st = b.st
 ORDER BY b.w, a.st
;

 

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