Правильное соединение Генератор месяцев с вашим запросом:
select to_char(to_date(mth_num, 'MM'), 'MONTH') month, nvl(cnt, 0) cnt
from (
select count(emp_id) as cnt, to_char(due_date, 'mm') mth_num
from emp_request where due_date is not null
group by to_char(due_date, 'mm')) e
right join (
select to_char(level, 'fm00') mth_num
from dual connect by level <= 12) m using (mth_num)
order by mth_num
Демо-версия dbfiddle
Генератор месяцев - это простой иерархический запрос, который дает нам 12 значений 01
, 02
... 12
:
select to_char(level, 'fm00') mth_num from dual connect by level <= 12
Вы также можете использовать системные представления для получения этих чисел:
select to_char(rownum, 'fm00') mth_num from all_objects where rownum <= 12
или этот синтаксис:
select to_char(column_value, 'fm00') mth_num
from table(sys.odcivarchar2list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12))
Лучше работать с числами, которые можно правильно отсортировать и преобразовать в названия месяцев на последнем шаге.Таким образом, у вас есть естественный месячный порядок.Если вы хотите быть уверены, что названия месяцев всегда на английском языке, не зависят от локальных настроек, используйте to_date
с третьим параметром, как здесь:
select to_char(sysdate, 'month', 'nls_date_language=english') from dual