제가 쿼리로 출력하고싶은것은
조회연월 YYYYMM 조회
주 | 일자 | 내국인 | 외국인 |
1주 | 2018-06-01 ~ 2018-06-02 | 45명 | 45명 |
2주 | 2018-06-03 ~ 2018-06-09 | 50명 | 50명 |
3주 | 2018-06-10 ~ 2018-06-16 | 60명 | 60명 |
4주 | 2018-06-17 ~ 2018-06-23 | 70명 | 67명 |
5주 | 2018-06-24 ~ 2018-06-30 | 45명 | 20명 |
테이블은 하나이고
그 테이블(테이블명 : A(가정))에 날짜(컬럼)가 들어가있는데 YYYYMMDD로 들어가있습니다. 타입은 CHAR입니다.
그리고 내국인 외국인은 KOREAN, JAPAN이라는 컬럼에 일자별로 인원수가 들어가있습니다.
출력시 1주에는 1주의 합이 들어가야 합니다.
조회시 조건에 월별로 검색을 하여서6월달을 검색을하면 6월달 안에 있는 데이터가 전부 출력이됩니다.
그런데 제가 출력하고싶은건 상단의 표처럼 5월달을 기준으로 조회를하면 1주 년-월-일 ~ 년-월-일 이런식으로 출력이 가능하게끔하고싶습니다.
SELECT TO_CHAR(TRUNC(YMD, 'DAY'), 'MM') || '월' "월" , TO_CHAR(TRUNC(YMD, 'DAY'), 'W') || '주' "주" , TO_CHAR(TRUNC(YMD, 'DAY'), 'YYYY-MM-DD') || ' ~ ' || TO_CHAR(TRUNC(YMD+7, 'DAY'), 'YYYY-MM-DD') "기간" FROM (SELECT TO_DATE( :YMD, 'YYYYMMDD' ) YMD FROM DUAL);
저는 2번 테이블없이 입력조건으로 자료를 뽑는 거라고 가정하고 작성한 쿼리입니다.
일자 | 내국인 | 외국인 |
20180601 | 45 | 45 |
20180603 | 50 | 50 |
20180611 | 60 | 60 |
20180623 | 70 | 67 |
원본 테이블이 이런형태로 생겼다는 말씀이신가요?
이걸 아래처럼 보여주고 싶다는 말씀이신가요?
주 | 일자 | 내국인 | 외국인 |
1주 | 2018-06-01 ~ 2018-06-02 | 45명 | 45명 |
2주 | 2018-06-03 ~ 2018-06-09 | 50명 | 50명 |
3주 | 2018-06-10 ~ 2018-06-16 | 60명 | 60명 |
4주 | 2018-06-17 ~ 2018-06-23 | 70명 | 67명 |
5주 | 2018-06-24 ~ 2018-06-30 | 45명 | 20명 |
최초 허술했던 질문에서 점차 가닥을 잡아가고 있네요.
정리해보면 : 일별 자료를 > 월조건으로 검색하여 > 주별로 집계해야 하는 문제입니다.
6/1 이 1주차라더니 다시 또 6/3 이 1주차가 되었네요?
왔다갔다 하지 마시고 중심을 잡아주세요.
SELECT (wdt - TRUNC(sdt, 'd')) / 7 + 1 w , TO_CHAR(GREATEST(wdt , sdt), 'yyyy-mm-dd') || ' ~ ' || TO_CHAR(LEAST(wdt + 6, edt), 'yyyy-mm-dd') dt , SUM(korea) korea , SUM(japan) japan FROM (SELECT TRUNC(dt, 'mm') sdt -- 월초 , LAST_DAY(dt) edt -- 월말 , TRUNC(dt, 'd') wdt -- 주초 , korea , japan FROM (SELECT TO_DATE(ymd, 'yyyymmdd') dt , korea , japan FROM t WHERE ymd LIKE '201806%' ) ) GROUP BY sdt, edt, wdt ORDER BY w ;
SELECT a.w, a.sdt, a.edt , NVL(SUM(b.korea), 0) korea , NVL(SUM(b.japan), 0) japan FROM (SELECT (wdt - TRUNC(sdt, 'd')) / 7 + 1 w , TO_CHAR(GREATEST(wdt , sdt), 'yyyymmdd') sdt , TO_CHAR(LEAST(wdt + 6, edt), 'yyyymmdd') edt , TO_CHAR(dt, 'yyyymmdd') ymd FROM (SELECT sdt + LEVEL - 1 dt , TRUNC(sdt + LEVEL - 1, 'd') wdt , sdt , LAST_DAY(sdt) edt FROM (SELECT TO_DATE('201806', 'yyyymm') sdt FROM dual) CONNECT BY LEVEL <= LAST_DAY(sdt) - sdt + 1 ) ) a LEFT OUTER JOIN t b ON a.ymd = b.ymd GROUP BY a.w, a.sdt, a.edt ORDER BY a.w ;