2017-12-14 5 views
1

나는 참석 한 강좌와 출석 일람을 열거 한 매우 작은 SQL 테이블을 가지고 있습니다. 나는 매달null에 관계없이 합계가있는 모든 달 나열하기

select to_char(DATE_ATTENDED,'YYYY/MM'), 
COUNT (*) 
FROM TRAINING_COURSE_ATTENDED 
WHERE COURSE_ATTENDED = 'Fire Safety' 
GROUP BY to_char(DATE_ATTENDED,'YYYY/MM') 
ORDER BY to_char(DATE_ATTENDED,'YYYY/MM') 

이 참석자를 가지고 매달 예상대로 목록을 반환에 대한 참석자을 계산 아래의 코드를 사용할 수 있습니다. 그러나 그것을

으로 입력하고 싶습니다.
January 2 
February 0 
March 5 

카운트 결과를 Null과 함께 표시하려면 어떻게합니까? 내 테이블은 매우 기본입니다.

1234 01-JAN-15 Fire Safety 
108 01-JAN-15 Fire Safety 
1443 02-DEC-15 Healthcare 
1388 03-FEB-15 Emergency 
1355 06-MAR-15 Fire Safety 
1322 09-SEP-15 Fire Safety 
1234 11-DEC-15 Fire Safety 

화재 안전을 위해서만 매월 전체 참석자를 표시하면됩니다. SQL 개발자를 잠시 동안 사용하지 않으므로 도움을 얻을 수 있습니다.

+2

모든 달이있는 표가 필요합니다. 나는 "Calendar table" – HoneyBadger

+0

'... right outer join calendar_table ... '(왼쪽 결합 전에 오른쪽 조인을 권하는 아주 드문 경우 중 하나)을 검색하는 것이 좋습니다. – jarlh

답변

0

표시하려는 기간을 선택하려면 달력 표가 필요합니다. 단순화 된 코드는 다음과 같습니다

select to_char(c.Date_dt,'YYYY/MM') 
, COUNT (*) 

FROM calendar as c 
left join TRAINING_COURSE_ATTENDED as tca 
on tca.DATE_ATTENDED = c.Date_dt 

WHERE tca.COURSE_ATTENDED = 'Fire Safety' 
    and c.Date_dt between [period_start_dt] and [period_end_dt] 
GROUP BY to_char(c.Date_dt,'YYYY/MM') 
ORDER BY to_char(c.Date_dt,'YYYY/MM') 
0

이 시도 :

SELECT Trunc(date_attended, 'MM') Month, 
     Sum(CASE 
      WHEN course_attended = 'Fire Safety' THEN 1 
      ELSE 0 
      END) Fire_Safety 
FROM training_course_attended 
GROUP BY Trunc(date_attended, 'MM') 
ORDER BY Trunc(date_attended, 'MM') 
0

당신은 당신의 자신의 세트를 만들 수 있습니다 년 월의 아래와 같은 0의 수와 사용 쿼리에-비행이 필요합니다.

Select yrmth,sum(counter) from 
(
    select to_char(date_attended,'YYYYMM') yrmth, 
      COUNT (1) counter 
    From TRAINING_COURSE_ATTENDED Where COURSE_ATTENDED = 'Fire Safety' 
    Group By Y to_char(date_attended,'YYYYMM') 
    Union All 
    Select To_Char(2015||Lpad(Rownum,2,0)),0 from Dual Connect By Rownum <= 12 
) 
group by yrmth 
order by 1 

여러 해를 표시 할 경우, 단지 달력 테이블 인라인 생성하는 또 다른 방법

Select To_Char(Year||Lpad(Month,2,0)) , 0 
From 
(select Rownum Month from Dual Connect By Rownum <= 12), 
(select 2015+Rownum-1 Year from Dual Connect By Rownum <= 3) 
0

에 2 쿼리를 변경합니다

with calendar (month_start, month_end) as 
    (select add_months(date '2014-12-01', rownum) 
      , add_months(date '2014-12-01', rownum +1) - interval '1' second 
     from dual 
     connect by rownum <= 12) 
select to_char(c.month_start,'YYYY/MM') as course_month 
    , count(tca.course_attended) as attended 
from calendar c 
     left join training_course_attended tca 
      on tca.date_attended between c.month_start and c.month_end 
      and tca.course_attended = 'Fire Safety' 
group by to_char(c.month_start,'YYYY/MM') 
order by 1; 

을 (당신은 또한만을 가질 수를 월이 달력 표에서 시작하고 trunc(tca.date_attended,'MONTH') = c.month_start에 가입하십시오. tca.date_attended의 색인 또는 분할이 덜 효과적 일 수도 있지만