2017-12-14 1 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') 

これは、参加者があり、各月の予想通りのリストを返すために、出席者をカウントするために以下のコードを使用することができます。しかし、私はそれを

のように記載したいと思います。

カウントの結果をヌルと一緒に表示するにはどうすればよいですか?私のテーブルは非常に基本的です。

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

すべての月があるテーブルが必要です。私は "カレンダーテーブル" – HoneyBadger

+0

'...右外部joinカレンダーテーブル...'(私は右ジョインを前に参加することをお勧めしたい非常に少数のケースの1つ)を検索することを提案したいと思います。 – 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

にカレンダーテーブルをインラインで生成する別の方法を第二のクエリを変更する、複数年のを表示したい場合は、次の

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のインデックスやパーティショニングで効率が低下する可能性があります)

関連する問題