Я понимаю, почему вы можете получить нулевой счет для значения текущего месяца; Ваш второй подзапрос имеет:
job.actual_start_date >= TRUNC(ADD_MONTHS(SYSDATE, 0), 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM'))
, что совпадает с
job.actual_start_date >= TRUNC(SYSDATE, 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM'))
и значение столбца не могут быть одновременно >=
и <
одинаковыми.
Я не уверен, почему вы получили бы ноль отсчетов и за предыдущий месяц - без корреляции я бы ожидал, что это может быть больше, чем вы, возможно, хотите, но не ноль, так что, возможно, что-то есть в данных, которые мы можем ' т см.
В любом случае ... как @ PM77-1 предлагает, вы можете упростить это с помощью условного агрегирования, что-то вроде:
select pv.param_value_name as fly_tip_location,
count(case when j.actual_start_date >= trunc(sysdate, 'MM') then j.job_number end) as current_month,
count(case when j.actual_start_date < trunc(sysdate, 'MM') then j.job_number end) as last_month
from job j
join job_status_log jsl on jsl.job_number = j.job_number
and jsl.job_log_number = j.job_log_number
--join job_status js on js.status_code = jsl.status_code -- not needed
join job_attribute ja on ja.job_number = j.job_number
join parameter_value pv on pv.param_type_code = ja.param_type_code
and pv.param_value_code = ja.param_value_code
where j.actual_start_date >= trunc(add_months(sysdate, -1), 'MM')
and jsl.status_code = '5200'
and pv.param_type_code = 'FT02'
group by pv.param_value_name
order by pv.param_value_name;
Это относится ко всем таблицам один раз - вам не нужно job_status
, поэтому я это закомментировал, но его можно полностью удалить - и отфильтровывает весь диапазон дат как что-либо после начала предыдущего месяца, и код состояния и тип параметра, который вас интересует.
Затем в каждом из положений агрегации / подсчета используется выражение регистра, чтобы решить, какие данные месяца он считает. В первом из них учитываются только задания, даты начала которых находятся после начала текущего месяца; во втором он только подсчитывает задания, даты начала которых предшествуют началу текущего месяца, т. е. в предыдущем месяце, поскольку это все, что осталось от фильтра в предложении where
.