2016-07-14 2 views
0

이번 여름에 닫힐 사무실에 대해 월별로 계산 된 수를 나눌 수있는 쿼리를 woking하고 있습니다. 달 이후오라클에서 0으로 계산 된 행을 검색하십시오.

SELECT 
    qa.tmonth, 
    COUNT(qa.tmonth) AS qtn 
FROM 
(
    SELECT TO_CHAR(CLOSURE_DATE, 'yyyymm') AS tmonth 
    FROM Holidays 
    WHERE CLOSURE_DATE >= TO_DATE('20160501', 'YYYY-MM-DD') AND 
      CLOSURE_DATE <= TO_DATE('20160901', 'YYYY-MM-DD') 
) qa 
GROUP BY qa.tmonth; 

: 5 월, 6 월, 8 월과 9에는 사무실이 출력 폐쇄되지 않습니다는 다음

TMONTH|QTN 
201607|80 

하지만이

TMONTH|QTN 
201605|0 
201606|0 
201607|80 
201608|0 
201609|0 

같은 일을해야합니다 내가 어떻게 그걸 얻을 수 있니?

모두에게 감사드립니다!

+0

특정 여름 달에 사무실을 폐쇄하지 않으면 계산에 집계 할 레코드가 없습니다. 이 경우 누락 된 달을 채우려면 달력 표에 가입해야합니다. –

답변

0

당신은이 같은 뭔가 시도 할 수 있습니다 :이 시작 및 종료 날짜 사이의 모든 일의 목록을 작성하기 위해 쿼리를 사용

SQL> with holidays(closure_date) as 
    2 (
    3 select date '2016-07-01' from dual union all 
    4 select date '2016-07-02' from dual union all 
    5 select date '2016-07-03' from dual union all 
    6 select date '2016-07-04' from dual union all 
    7 select date '2016-07-05' from dual 
    8 ) 
    9 select count(closure_date) as closure_days, to_char(day, 'yyyymm') as month 
10 from (
11   select date '2016-05-01' + level -1 as day 
12   from dual 
13   connect by date '2016-05-01' + level -1 <= date '2016-09-30' 
14  ) days 
15  left outer join holidays 
16   on (day = closure_date) 
17 group by to_char(day, 'yyyymm') ; 

CLOSURE_DAYS MONTH 
------------ ------ 
      0 201608 
      5 201607 
      0 201606 
      0 201605 
      0 201609 

SQL> 

; 나는 01/05과 30/09를 사용하고 그것을 days이라고 불렀다.

그런 다음 외부 조인에서 holidays 테이블로 days을 쿼리합니다. 이 방법을 사용하면 종결 일 목록에 특정 값이있는 일 수만 계산할 수 있으므로 매일, 월별로 일수를 계산할 수 있습니다. 년 및 월에 대한 집계가 작업을 완료합니다.

+0

나는 그것을 시험해 보았지만 7 월에도 80 개의 줄이 있었는데 0 카운트를 가진 모든 달을 준다. – Chrix1387

+0

그냥 약간의 샘플 데이터로 어떻게 작동하는지 보여주기 위해 편집되었다; 문제를 보여주기 위해 시작 데이터의 추출물을 게시하십시오. – Aleksej

+0

시간을 필요로하지 않기 때문에 문자열을 포맷하는 것을 잊어 버렸습니다. 조금 수정했으며 완벽하게 감사합니다! – Chrix1387

0

위와 비슷한 방식입니다. 팁 : 두 개의 하위 쿼리를 별도로 실행하여 논리를 분석 할 수 있습니다.

select to_char (m.month, 'yyyymm') as TMONTH, m.month, 
     nvl (h.qtn, 0) as QTN 
from 
(
    SELECT add_months(trunc (SYSDATE, 'MONTH'), -(LEVEL-1)) as MONTH 
    FROM dual 
    CONNECT BY LEVEL <= 12 -- generate a list of the last 12 month 
) m 
left join 
(
    SELECT trunc (closure_date, 'MONTH') as MONTH, 
     count (*) as QTN 
    FROM Holidays 
    group by trunc (closure_date, 'MONTH') 
) h 
on m.MONTH = h.MONTH 
where m.month between DATE '2016-01-01' and sysdate 
order by TMONTH desc; 
관련 문제